[trackballs] 01/09: New upstream version 1.3.0

Markus Koschany apo at moszumanska.debian.org
Thu Mar 15 13:29:10 UTC 2018


This is an automated email from the git hooks/post-receive script.

apo pushed a commit to branch master
in repository trackballs.

commit 484319caf1b52b4cb47c77ab51d30cdc7ef44445
Author: Markus Koschany <apo at debian.org>
Date:   Thu Mar 15 13:53:14 2018 +0100

    New upstream version 1.3.0
---
 CMakeLists.txt                              |   79 ++-
 TODO.md                                     |   29 +-
 cmake/FindGC.cmake                          |    8 +-
 cmake/FindGuile.cmake                       |    1 +
 cmake/FindSDL2_and_friends.cmake            |    4 +
 docs/api.html                               |   44 +-
 docs/customizing.html                       |   21 +-
 docs/examples.html                          |   59 +-
 docs/index.html                             |   18 +-
 docs/mapeditor.html                         |   18 +-
 docs/scriptingLanguage.html                 |   32 +-
 po/de.po                                    |  572 ++++++++-------
 po/fr.po                                    |  566 ++++++++-------
 po/hu.po                                    |  565 ++++++++-------
 po/it.po                                    |  563 ++++++++-------
 po/sk.po                                    |  565 ++++++++-------
 po/sv.po                                    |  563 ++++++++-------
 po/trackballs.pot                           |  560 ++++++++-------
 share/levels/bx1.scm                        |    4 +-
 share/levels/bx2.map                        |  Bin 88541 -> 88590 bytes
 share/levels/bx2.scm                        |   78 +-
 share/levels/bx3.scm                        |  159 +++--
 share/levels/con2.scm                       |    5 +-
 share/levels/con4.map                       |  Bin 66824 -> 66732 bytes
 share/levels/con4.scm                       |    2 +-
 share/levels/dn6.scm                        |    4 +-
 share/levels/ds.jpg                         |  Bin 0 -> 83882 bytes
 share/levels/ds.set                         |    4 +
 share/levels/{frg7.map => ds1.map}          |  Bin 60224 -> 60191 bytes
 share/levels/ds1.scm                        |   46 ++
 share/levels/{fourSeasons_4.map => ds2.map} |  Bin 60701 -> 61648 bytes
 share/levels/ds2.scm                        |   67 ++
 share/levels/{frg8.map => ds3.map}          |  Bin 61851 -> 63752 bytes
 share/levels/ds3.scm                        |  111 +++
 share/levels/ds_lib.scm                     |   73 ++
 share/levels/fourSeasons_4.map              |  Bin 60701 -> 60712 bytes
 share/levels/frg7.map                       |  Bin 60224 -> 60250 bytes
 share/levels/frg8.map                       |  Bin 61851 -> 61849 bytes
 share/levels/ki1.scm                        |    8 -
 share/levels/ki2.scm                        |    7 -
 share/levels/ki3.scm                        |    2 -
 share/levels/ki5.scm                        |    2 -
 share/levels/lv6.scm                        |    4 +-
 share/levels/lv9.scm                        |    2 +-
 share/levels/mhm2.scm                       |   38 +-
 share/levels/mhm3.scm                       |   30 +-
 share/levels/motion1.map                    |  Bin 67898 -> 75514 bytes
 share/levels/motion1.scm                    |  119 ++--
 share/levels/sl5.map                        |  Bin 75174 -> 75179 bytes
 share/levels/sl5.scm                        |   10 +-
 share/levels/sl6.map                        |  Bin 67006 -> 68126 bytes
 share/shaders/basic.frag                    |    2 +-
 share/shaders/object.frag                   |    2 +-
 src/animated.cc                             |    3 +-
 src/animatedCollection.cc                   |   11 +-
 src/animator.cc                             |    3 +-
 src/baby.cc                                 |    8 -
 src/baby.h                                  |    3 -
 src/ball.cc                                 | 1016 ++++++++++++++++++---------
 src/ball.h                                  |   18 +-
 src/bird.cc                                 |    2 +-
 src/black.cc                                |   27 +-
 src/black.h                                 |    2 +-
 src/cactus.cc                               |    5 +-
 src/cyclicPlatform.cc                       |    3 +-
 src/debris.cc                               |    4 +-
 src/diamond.cc                              |    8 +-
 src/editMode.cc                             |   46 +-
 src/editWindows.cc                          |   14 +-
 src/editWindows.h                           |    4 +-
 src/flag.cc                                 |   11 +-
 src/forcefield.cc                           |    9 +-
 src/fountain.cc                             |    2 +-
 src/game.cc                                 |    3 +-
 src/gamer.cc                                |    2 +-
 src/general.cc                              |    7 +-
 src/general.h                               |   51 +-
 src/glHelp.cc                               |  117 ++-
 src/glHelp.h                                |   48 +-
 src/goal.cc                                 |    4 +-
 src/guile.cc                                |   35 +-
 src/heightModifier.cc                       |   14 +-
 src/helpMode.cc                             |   10 +-
 src/highScore.cc                            |   39 +-
 src/highScore.h                             |    1 +
 src/hofMode.cc                              |    7 +-
 src/mainMode.cc                             |   65 +-
 src/map.cc                                  |  207 +++---
 src/map.h                                   |   13 +-
 src/menusystem.cc                           |    1 -
 src/mmad.cc                                 |   60 +-
 src/modPill.cc                              |   38 +-
 src/myWindow.cc                             |    6 +-
 src/myWindow.h                              |    2 +-
 src/pipe.cc                                 |   22 +-
 src/pipeConnector.cc                        |    2 +-
 src/player.cc                               |  236 +++----
 src/player.h                                |    4 +-
 src/settings.cc                             |   58 +-
 src/settings.h                              |    3 +
 src/settingsMode.cc                         |   49 +-
 src/settingsMode.h                          |    3 +
 src/setupMode.cc                            |   48 +-
 src/setupMode.h                             |    2 +-
 src/sideSpike.cc                            |    6 +-
 src/sign.cc                                 |    2 +-
 src/sparkle2d.cc                            |    8 +-
 src/spike.cc                                |    9 +-
 src/switch.cc                               |    3 +-
 src/teleport.cc                             |    6 +-
 110 files changed, 4212 insertions(+), 3224 deletions(-)

diff --git a/CMakeLists.txt b/CMakeLists.txt
index a692be5..05d3168 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -9,25 +9,38 @@ find_package(OpenGL REQUIRED)
 find_package(ZLIB REQUIRED)
 # libgc is a dependency of Guile that still needs to be provided
 find_package(GC REQUIRED)
+find_package(Intl REQUIRED)
 
-# Optionally set data dir and locale dir
-set(TRACKBALLS_LOCALE_DIR "" CACHE FILEPATH "Folder to install locale files to. Empty means default.")
-set(TRACKBALLS_SHARE_DIR "" CACHE FILEPATH "Folder to install data files to. Empty means default.")
-set(TRACKBALLS_HIGHSCORES_DIR "" CACHE STRING "Folder to install highscores file to. Empty means to TRACKBALLS_SHARE_DIR. ~ will install per user")
+# Optionally set paths to install individual components
+function(setordefault varname variable default)
+  if ("${variable} " STREQUAL " ")
+    set(${varname} ${default} PARENT_SCOPE)
+  else()
+    set(${varname} ${variable} PARENT_SCOPE)
+  endif()
+endfunction()
 
-if ("${TRACKBALLS_LOCALE_DIR}" STREQUAL "")
-  set(TRACKBALLS_LOCALE ${CMAKE_INSTALL_PREFIX}/share/locale)
-else()
-  set(TRACKBALLS_LOCALE ${TRACKBALLS_LOCALE_DIR})
-endif()
-if ("${TRACKBALLS_SHARE_DIR}" STREQUAL "")
-  set(TRACKBALLS_SHARE ${CMAKE_INSTALL_PREFIX}/share/trackballs)
-else()
-  set(TRACKBALLS_SHARE ${TRACKBALLS_SHARE_DIR})
-endif()
+set(TRACKBALLS_APPL_DIR "" CACHE PATH "Folder to install .desktop files to. If empty, the default is CMAKE_INSTALL_PREFIX/share/applications")
+set(TRACKBALLS_DOC_DIR "" CACHE PATH "Folder to install documentation to. If empty, the default is CMAKE_INSTALL_PREFIX/share/doc")
+set(TRACKBALLS_BIN_DIR "" CACHE PATH "Folder to install executable files to. If empty, the default is CMAKE_INSTALL_PREFIX/bin")
+set(TRACKBALLS_ICON_DIR "" CACHE PATH "Folder to install icons to. If empty, the default is CMAKE_INSTALL_PREFIX/share/icons/hicolor")
+set(TRACKBALLS_LOCALE_DIR "" CACHE PATH "Folder to install locale files to. If empty, the default is CMAKE_INSTALL_PREFIX/share/locale")
+set(TRACKBALLS_MAN_DIR "" CACHE PATH "Folder to install man files to. If empty, the default is CMAKE_INSTALL_PREFIX/share/man")
+set(TRACKBALLS_SHARE_DIR "" CACHE PATH "Folder to install data files to. If empty, the default is CMAKE_INSTALL_PREFIX/share/trackballs")
 
+set(TRACKBALLS_HIGHSCORES_DIR "" CACHE STRING "Folder to install highscores file to. Empty means to TRACKBALLS_SHARE_DIR/. ~ will install per user")
+
+setordefault(TRACKBALLS_APPL "${TRACKBALLS_APPL_DIR}" ${CMAKE_INSTALL_PREFIX}/share/applications)
+setordefault(TRACKBALLS_BIN "${TRACKBALLS_BIN_DIR}" ${CMAKE_INSTALL_PREFIX}/bin)
+setordefault(TRACKBALLS_DOC "${TRACKBALLS_DOC_DIR}" ${CMAKE_INSTALL_PREFIX}/share/doc)
+setordefault(TRACKBALLS_ICON "${TRACKBALLS_ICON_DIR}" ${CMAKE_INSTALL_PREFIX}/share/icons/hicolor)
+setordefault(TRACKBALLS_LOCALE "${TRACKBALLS_LOCALE_DIR}" ${CMAKE_INSTALL_PREFIX}/share/locale)
+setordefault(TRACKBALLS_MAN "${TRACKBALLS_MAN_DIR}" ${CMAKE_INSTALL_PREFIX}/share/man)
+setordefault(TRACKBALLS_SHARE "${TRACKBALLS_SHARE_DIR}" ${CMAKE_INSTALL_PREFIX}/share/trackballs)
+
+# Set defines
 add_definitions(-DPACKAGE="trackballs")
-add_definitions(-DVERSION="1.2.4")
+add_definitions(-DVERSION="1.3.0")
 add_definitions(-DLOCALEDIR="${TRACKBALLS_LOCALE}")
 add_definitions(-DHAVE_CONFIG_H)
 add_definitions(-DSHARE_DIR="${TRACKBALLS_SHARE}")
@@ -44,7 +57,7 @@ foreach( d ${definitions} )
     set(defstr "${defstr}" "-D${d}")
 endforeach()
 
-include_directories(${PROJECT_SOURCE_DIR}/src ${GUILE_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} ${SDL2_INCLUDE_DIR} ${SDL2_IMAGE_INCLUDE_DIR} ${SDL2_MIXER_INCLUDE_DIR} ${SDL2_TTF_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS} ${GC_INCLUDE_DIRS})
+include_directories(${PROJECT_SOURCE_DIR}/src ${GUILE_INCLUDE_DIRS} ${CMAKE_CURRENT_BINARY_DIR} ${SDL2_INCLUDE_DIR} ${SDL2_IMAGE_INCLUDE_DIR} ${SDL2_MIXER_INCLUDE_DIR} ${SDL2_TTF_INCLUDE_DIR} ${ZLIB_INCLUDE_DIRS} ${GC_INCLUDE_DIRS} ${Intl_INCLUDE_DIRS})
 get_directory_property(includes DIRECTORY  ${CMAKE_SOURCE_DIR} INCLUDE_DIRECTORIES)
 set(incstr "")
 foreach( d ${includes} )
@@ -60,8 +73,8 @@ add_custom_command(OUTPUT guile.cc.x
 # Construct executable file
 file(GLOB sources ${PROJECT_SOURCE_DIR}/src/*.cc)
 add_executable(trackballs ${sources} guile.cc.x)
-target_link_libraries(trackballs ${GUILE_LIBRARIES} ${OPENGL_LIBRARIES} ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARY} ${SDL2_MIXER_LIBRARY} ${SDL2_TTF_LIBRARY} ${ZLIB_LIBRARIES} ${GC_LIBRARIES} m)
-install(TARGETS trackballs DESTINATION bin)
+target_link_libraries(trackballs ${GUILE_LIBRARIES} ${OPENGL_LIBRARIES} ${SDL2_LIBRARY} ${SDL2_IMAGE_LIBRARY} ${SDL2_MIXER_LIBRARY} ${SDL2_TTF_LIBRARY} ${ZLIB_LIBRARIES} ${GC_LIBRARIES} ${Intl_LIBRARIES} m)
+install(TARGETS trackballs DESTINATION ${TRACKBALLS_BIN})
 
 # Data files
 install(DIRECTORY ${PROJECT_SOURCE_DIR}/share/fonts DESTINATION ${TRACKBALLS_SHARE})
@@ -70,6 +83,8 @@ install(DIRECTORY ${PROJECT_SOURCE_DIR}/share/levels DESTINATION ${TRACKBALLS_SH
 install(DIRECTORY ${PROJECT_SOURCE_DIR}/share/music DESTINATION ${TRACKBALLS_SHARE})
 install(DIRECTORY ${PROJECT_SOURCE_DIR}/share/shaders DESTINATION ${TRACKBALLS_SHARE})
 install(DIRECTORY ${PROJECT_SOURCE_DIR}/share/sfx DESTINATION ${TRACKBALLS_SHARE})
+install(FILES ${PROJECT_SOURCE_DIR}/share/icons/trackballs-128x128.png DESTINATION ${TRACKBALLS_SHARE}/icons/)
+
 #todo: set executable setgid to games RX, and highscores to games RW
 add_custom_command(OUTPUT highScores
                    COMMAND echo "0" | gzip -c > ${CMAKE_CURRENT_BINARY_DIR}/highScores)
@@ -84,9 +99,9 @@ else()
 endif()
 
 # Documentation
-install(FILES ${PROJECT_SOURCE_DIR}/share/trackballs.6 DESTINATION man/man6)
+install(FILES ${PROJECT_SOURCE_DIR}/share/trackballs.6 DESTINATION ${TRACKBALLS_MAN}/man6)
 file(GLOB htmldocs ${PROJECT_SOURCE_DIR}/docs/*.html ${PROJECT_SOURCE_DIR}/docs/*.css)
-install(FILES ${htmldocs} DESTINATION ${TRACKBALLS_SHARE}/docs)
+install(FILES ${htmldocs} DESTINATION ${TRACKBALLS_DOC})
 
 # Icons are split up into separate folders
 file(GLOB icons ${PROJECT_SOURCE_DIR}/share/icons/*.png)
@@ -94,19 +109,23 @@ foreach(file ${icons})
   string(REGEX REPLACE ".*trackballs-" "" filea ${file})
   string(REPLACE ".png" "" sz ${filea})
   install(FILES ${file}
-          DESTINATION ${TRACKBALLS_SHARE}/../icons/hicolor/${sz}/apps/
+          DESTINATION ${TRACKBALLS_ICON}/${sz}/apps/
           RENAME trackballs.png)
 endforeach()
 install(FILES ${PROJECT_SOURCE_DIR}/share/icons/trackballs.svg
-        DESTINATION ${TRACKBALLS_SHARE}/../icons/hicolor/scalable/apps/)
+        DESTINATION ${TRACKBALLS_ICON}/icons/hicolor/scalable/apps/)
 install(FILES ${PROJECT_SOURCE_DIR}/share/icons/trackballs.desktop
-        DESTINATION ${TRACKBALLS_SHARE}/../applications)
+        DESTINATION ${TRACKBALLS_APPL})
 
 # Translations!
-find_package(Gettext)
-file(GLOB po_files po/*.po)
-foreach(po_file ${po_files})
-  get_filename_component(lang ${po_file} NAME_WE)
-  GETTEXT_PROCESS_PO_FILES( ${lang} ALL PO_FILES ${po_file} )
-  install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${lang}.gmo DESTINATION ${TRACKBALLS_LOCALE}/${lang}/LC_MESSAGES/ RENAME trackballs.mo)
-endforeach()
+option(DISABLE_NLS "Disable native language support (NLS)" OFF)
+if(NOT DISABLE_NLS)
+  find_package(Gettext)
+  mark_as_advanced(GETTEXT_MSGFMT_EXECUTABLE GETTEXT_MSGMERGE_EXECUTABLE)
+  file(GLOB po_files po/*.po)
+  foreach(po_file ${po_files})
+    get_filename_component(lang ${po_file} NAME_WE)
+    GETTEXT_PROCESS_PO_FILES( ${lang} ALL PO_FILES ${po_file} )
+    install(FILES ${CMAKE_CURRENT_BINARY_DIR}/${lang}.gmo DESTINATION ${TRACKBALLS_LOCALE}/${lang}/LC_MESSAGES/ RENAME trackballs.mo)
+  endforeach()
+endif()
diff --git a/TODO.md b/TODO.md
index 239b20c..dfbd25a 100644
--- a/TODO.md
+++ b/TODO.md
@@ -7,25 +7,12 @@ code cleanup and documentation
 Bugs marked with a (?) after the title *may* already have been fixed. 
 Verify if these bugs still are present.
 
-1. **Up-arrow stuck**? The up-arrow is sometimes stuck when restarting a new 
-level. 
-
-1. **Broken physics** Fix cheat in ball physics - by moving to close to 
-another cell you can get drawn up on it.
-
-1. **Broken physics**? Sometimes the ball can get stuck on an edge. Clue to 
-find bug: print out the position of the ball continuously, play until such a 
-position is found and restart from that 
-position while debugging.
-
 1. **Ground physics** Make the friction etc. of ice and normal ground 
 configurable.
 
 1. **Pipe physics** Fix the physics when entering pipes, rather than bouncing 
 on entrance.
 
-1. **Heightmodifier broken** Doesn't seem to update the center of the squares.
-
 ## Feature requests
 
 
@@ -140,26 +127,13 @@ maybe somewhat like a "comet", leaving trails (glowing particles?)
 1. **Sound effects** Use all the new sound effects (warren's sound and the 
 new laughters)
 
-1. **Internationalization**   (UNDER WAY)
-
 1. **Levelset information** Make the .set files more elaboration with 
 descriptive texts, info from the author etc.  Perhaps even screenshots?
 
-## Code cleanup
-
-1. **Desktop and icon install** Determine where to install desktop and icon
-files so that desktop environments and programs can find them
-
-1. **Level fixes** Many levels can be polished some more by fixing background 
-colors etc.
-
 
 ## Documentation
 
 
-1. **Documentation** New script commands set-song-preference, force-next-song 
-and clear-song-preferences to allow choosing specific songs for levels.
-
 1. **Keys in menus** Document how the keys are used instead of the mouse in 
 the menu system.
 
@@ -174,8 +148,7 @@ added: snow, rain Double check that all functions are documented.
 1. **editor** Document all keys/menu entries in the editor. Esp: the "smooth" 
 feature
 
-1. **help screen** Extra life, birds, teleporters, cactus  => picture added 
-in the help1_*.png. Just have to add description text
+1. **help screen** Extra life, birds, teleporters, cactus, etc.
 
 1. **Default values** Document the default values for all configurable values.
 
diff --git a/cmake/FindGC.cmake b/cmake/FindGC.cmake
index baafcd7..9e4cd4b 100644
--- a/cmake/FindGC.cmake
+++ b/cmake/FindGC.cmake
@@ -11,13 +11,15 @@ find_path(GC_INCLUDE_DIR NAMES gc/gc.h gc/gc_inline.h
           HINTS ${PC_GC_INCLUDEDIR} ${PC_GC_INCLUDE_DIRS})
 
 find_library(GC_LIBRARY NAMES gc
-             HINTS ${PC_GC_LIBDIR} ${PC_GC_LIBRARY_DIRS} )
+             HINTS ${PC_GC_LIBDIR} ${PC_GC_LIBRARY_DIRS})
 
 include(FindPackageHandleStandardArgs)
 find_package_handle_standard_args(libgc REQUIRED_VARS
                                   GC_LIBRARY GC_INCLUDE_DIR
                                   VERSION_VAR PC_GC_VERSION)
 
-set(GC_LIBRARIES ${GC_LIBRARY} )
-set(GC_INCLUDE_DIRS ${GC_INCLUDE_DIR} )
+set(GC_LIBRARIES ${GC_LIBRARY})
+set(GC_INCLUDE_DIRS ${GC_INCLUDE_DIR})
+
+mark_as_advanced(GC_LIBRARY GC_INCLUDE_DIR)
 
diff --git a/cmake/FindGuile.cmake b/cmake/FindGuile.cmake
index 26e7b0d..8b93daa 100644
--- a/cmake/FindGuile.cmake
+++ b/cmake/FindGuile.cmake
@@ -32,3 +32,4 @@ find_package_handle_standard_args(libguile REQUIRED_VARS
 set(GUILE_LIBRARIES ${GUILE_LIBRARY} )
 set(GUILE_INCLUDE_DIRS ${GUILE_INCLUDE_DIR} )
 
+mark_as_advanced(GUILE_LIBRARY GUILE_INCLUDE_DIR GUILE_SNARF)
diff --git a/cmake/FindSDL2_and_friends.cmake b/cmake/FindSDL2_and_friends.cmake
index b35cb9e..c371934 100644
--- a/cmake/FindSDL2_and_friends.cmake
+++ b/cmake/FindSDL2_and_friends.cmake
@@ -55,3 +55,7 @@ set(SDL2_INCLUDE_DIRS ${SDL2_INCLUDE_DIR} )
 set(SDL2_IMAGE_INCLUDE_DIRS ${SDL2_IMAGE_INCLUDE_DIR} )
 set(SDL2_MIXER_INCLUDE_DIRS ${SDL2_MIXER_INCLUDE_DIR} )
 set(SDL2_TTF_INCLUDE_DIRS ${SDL2_TTF_INCLUDE_DIR} )
+mark_as_advanced(SDL2_LIBRARY SDL2_INCLUDE_DIR
+                 SDL2_IMAGE_LIBRARY SDL2_IMAGE_INCLUDE_DIR
+                 SDL2_MIXER_LIBRARY SDL2_MIXER_INCLUDE_DIR
+                 SDL2_TTF_LIBRARY SDL2_TTF_INCLUDE_DIR)
diff --git a/docs/api.html b/docs/api.html
index b79980f..4a88eef 100644
--- a/docs/api.html
+++ b/docs/api.html
@@ -109,7 +109,7 @@ Creates a lethal spike (comming from the side). Returns an 'animated' object.
 <div class="fn">
 <div class="fn-proto">(add-goal x y rotate-p next-level)</div>
 <div class="fn-text">
-Adds a new goal to the map. Orientation is given by rotate-p (horizontal or vertical) and the next level to go to is given as a string name (eg. "foo" to go to level "foo.map"). Returns an 'animated' object.
+Adds a new goal to the map. Goals are double sided, and their orientation is given by the boolean rotate-p. The next level to go to is given as a string name (eg. "foo" to go to level "foo.map"). Returns an 'animated' object.
 </div>
 </div>
 
@@ -382,7 +382,7 @@ Turns off the global light, making it night time.
 <div class="fn">
 <div class="fn-proto">(fog [strength])</div>
 <div class="fn-text">
-Turns on fog in the game, with the given strength going from 0 to 2.
+Turns on fog in the game, with the given strength going from 0 to 2. Default strength is 1. Use 'thick-fog' as an alias for strength 2.
 </div>
 </div>
 
@@ -473,14 +473,14 @@ Sets the players starting position.
 <div class="fn">
 <div class="fn-proto">(snow strength)</div>
 <div class="fn-text">
-Turns on snow. Strength must be in the range 0.0 to 1.0
+Turns on snow. Strength must be in the range 0.0 to 1.0.
 </div>
 </div>
 
 <div class="fn">
 <div class="fn-proto">(rain strength)</div>
 <div class="fn-text">
-Turns on rain. Strength must be in the range 0.0 to 1.0
+Turns on rain. Strength must be in the range 0.0 to 1.0.
 </div>
 </div>
 
@@ -560,7 +560,14 @@ Sets the weight for playing the given song.
 <div class="fn">
 <div class="fn-proto">(trigger x y radius function)</div>
 <div class="fn-text">
-Call the given function each tick when the player is within given radius from x/y.
+Call the given function each tick when the player is within given radius from x/y. 'function' takes no arguments.
+</div>
+</div>
+
+<div class="fn">
+<div class="fn-proto">(trigger-once x y radius function)</div>
+<div class="fn-text">
+Call the given function only the first time that the player is within given radius from x/y. 'function' takes no arguments.
 </div>
 </div>
 
@@ -596,6 +603,14 @@ Turns on/off the given flag in all cells in the region x0/y0 to x1/y1. Flag must
 </div>
 
 <div class="fn">
+<div class="fn-proto">(get-cell-flag x y flag)</div>
+<div class="fn-text">
+Returns #t if the cell at x,y has the flag enabled, otherwise #f. Flag must here be one of the '*cell-' flags.
+<p/>
+</div>
+</div>
+
+<div class="fn">
 <div class="fn-proto">(set-cell-velocity x0 y0 x1 y1 vx vy)</div>
 <div class="fn-text">
 Modifies the velociy of the given cells. This is used primarily by cells which have the "track" property set.
@@ -637,7 +652,24 @@ Copies the region of cells from x0/y0 to x1/y1 inclusive so that x0/y0 gets mapp
 </div>
 </div>
 
-<h2> Constants </h2> These functions modify or read the global state of the game. Such as turning on fog, or making it night etc.
+<h2> Miscellaneous </h2> These functions don't quite fit in any other category.
+
+<div class="fn">
+<div class="fn-proto">(_ str)</div>
+<div class="fn-text">
+Marks a string as translatable, but returns the original string.
+</div>
+</div>
+
+<div class="fn">
+<div class="fn-proto">(translate str)</div>
+<div class="fn-text">
+Translates a string which has been marked as translatable, assuming a translation
+exists for the active locale.
+</div>
+</div>
+
+<h2> Constants </h2> These constants are used as arguments to other functions.
 
 <div class="fn">
 <div class="fn-proto">*mod-speed* *mod-jump* *mod-spike* *mod-glass* *mod-dizzy* *mod-frozen* *mod-float* *mod-extra-life* *mod-large* *mod-small* *mod-nitro* </div>
diff --git a/docs/customizing.html b/docs/customizing.html
index b259069..5044222 100644
--- a/docs/customizing.html
+++ b/docs/customizing.html
@@ -24,18 +24,19 @@
 
 Trackballs comes with a build in map editor which can be used to
 create your own levels, which you are encouraged to share with other
-people. Please send any nice levels you make to mathias.broxvall at
-gmail.com and I will put them up on the official websites for other
-people to download.
+people. Please upload any nice levels you make as an attachment at
+<a href="https://github.com/trackballs/trackballs/issues">the issue tracker</a> and
+I will put them up on the official 
+<a href="https://trackballs.github.io/">website</a> for other people to download.
 <p/>
 
-Each level consits of two things, a <tt> .map </tt> and a <tt> .scm
+Each level consists of two things, a <tt> .map </tt> and a <tt> .scm
 </tt> file. The map file contains all the terrain which builds up a
-level whie the scm file contains a list of all the objects and
+level while the scm file contains a list of all the objects and
 settings for this specific map. 
 <p/>
 
-Appart from creating specific levels, it is also possible to create
+Apart from creating specific levels, it is also possible to create
 new <em> sets </em> of levels. In order to do this you need to also
 create a <tt> .set </tt> file which describes the general theme and
 gives the name of the first level in the set. All the remaining levels
@@ -48,17 +49,17 @@ of how your level looks. <p/>
 
 Instead of creating your own levels it is of course possible to use
 levels and sets from others. Take a look at the
-<a href="http://trackballs.sourceforge.net"> trackballs webpage </a>
+<a href="https://trackballs.github.io/"> trackballs webpage </a>
 to see if any new levels have appeared after the latest release. In
 order to install a custom created or a downloaded sets of levels you
 need to place all the files (<tt> .map, .scm, .set, .jpg</tt>) under
 your share/levels directory. For windows users this means into the
 share\levels directory where trackballs is currently installed. For
-linux users this means into either <tt>/usr/local/share/trackballs/levels/</tt>
+Linux users this means into either <tt>/usr/local/share/trackballs/levels/</tt>
 (assuming that the game is installed under /usr/local) or under
 <tt>$HOME/.trackballs/levels/</tt>. If you are unsure where your other levels
-are currenly installed just search for the file "lv1.scm" anywhere on
-your harddrive. 
+are currently installed just search for the file "lv1.scm" anywhere on
+your hard drive. 
 </p>
 
 <h3> Getting started </h3>
diff --git a/docs/examples.html b/docs/examples.html
index f302975..d32515e 100644
--- a/docs/examples.html
+++ b/docs/examples.html
@@ -22,11 +22,8 @@
 
 <h1> Examples </h1>
 
-This section should contain some intersting examples of how things can
+This section should contain some interesting examples of how things can
 be done with the scripting language.
-<p/>
-<b>TODO: </b> Add some (more) interesting example uses of the scripting language here.
-<p/>
 
 This shows how create a flag which gives time as a reward instead of
 point when it is taken. In this case the player gets 10 bonus seconds
@@ -37,14 +34,64 @@ by taking the flag.
 </pre></div>
 
 And as you can see this trick works for many different types of
-animated objects like Mr Black's, Babies, Birds, Cactuses and even the
-player object himself!
+animated objects like Mr Black's, Babies, Birds, Cacti and even the
+player themself!
 <div class="code"><pre>
 (define my-flag (new-mr-black 100.5 100.5))
 (time-on-death my-flag 10.0) 
 </pre></div>
 
+It's possible to start the level with the player permanently under some 
+condition; for instance, to ensure the player begins tiny and with spikes:
+<div class="code"><pre>
+(set-modtime (player) *mod-spike* -1.)
+(set-modtime (player) *mod-small* -1.)
+</pre></div>
 
+As Trackballs uses Scheme for its scripting language, mathematical and logical 
+operations are also available, and permit the construction of complicated
+helper functions. The following code segment demonstrates functions which 
+create two parallel pipes a fixed width apart and create a pair of invisible
+and instant teleporters.
+<div class="code"><pre>
+(define make-pipe-link
+  (lambda (x1 y1 x2 y2 z)
+    (let* ((rx (- y1 y2))
+           (ry (- x2 x1))
+           (nrm (* 4 (sqrt (+ (* rx rx) (* ry ry)))))
+           (dx (/ rx nrm))
+           (dy (/ ry nrm)))
+    (pipe (+ x1 dx) (+ y1 dy) (- z 0.1) (+ x2 dx) (+ y2 dy) (- z 0.1) 0.1)
+    (pipe (- x1 dx) (- y1 dy) (- z 0.1) (- x2 dx) (- y2 dy) (- z 0.1) 0.1))))
+
+(make-pipe-link 125.0 200.2 130.0 193.5 1.95)
+    
+(define make-teleport-pair 
+  (lambda (x0 y0 x1 y1 r)
+    (let ((last-cell 0))
+      (smart-trigger x0 y0 r
+        (lambda ()
+          (if (not (= last-cell 1))
+            (let ((px  (+ (get-position-x (player)) (- x1 x0)))
+                  (py  (+ (get-position-y (player)) (- y1 y0)))
+                  (pz  (get-position-z (player))))
+              (set! last-cell 2)
+              (set-position (player) px py pz)
+              (camera-force-focus px py pz))))
+        (lambda () (set! last-cell 0)))
+      (smart-trigger x1 y1 r
+        (lambda ()
+          (if (not (= last-cell 2))
+            (let ((px  (+ (get-position-x (player)) (- x0 x1)))
+                  (py  (+ (get-position-y (player)) (- y0 y1)))
+                  (pz  (get-position-z (player))))
+              (set! last-cell 1)
+              (set-position (player) px py pz)
+              (camera-force-focus px py pz))))
+        (lambda () (set! last-cell 0))))))
+        
+(make-teleport-pair 230 230 10 10 0.5)
+</pre></div>
 
 </div>
 </body>
diff --git a/docs/index.html b/docs/index.html
index 3a0c3d3..37813d9 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -24,14 +24,14 @@
 
  Trackballs is a simple game similar to the classical game Marble
  Madness on the Amiga in the 80's. By steering a marble ball through a
- labyrinth filled with vicious hammers, pools of acid and other
+ labyrinth filled with vicious spikes, pools of acid and other
  obstacles, the player collects points. When the ball reaches the
  destination it continues to the next, more difficult track - unless
- the time runs out.  
+ the time runs out.
 <p/>
 
  It should be noted that this game is not intended to be a replica of
- marble madness but rather inspired by it. For instance the game uses
+ Marble Madness but rather inspired by it. For instance the game uses
  advanced 3D graphics even though the original game had no real use
  for it. Also we aim at making the game highly configurable by a
  scripting extension (Guile) and provide a simple editor by which new
@@ -54,7 +54,7 @@ some statistics such as which levels you have completed, your best
 scores etc. After entering your name you should decide which "level
 set" you want to play. These level sets are like different version of
 the game with a different feel to them, often made by different people
-all over the internet. You can browse between the diffferent sets of
+all over the internet. You can browse between the different sets of
 levels by left and/or right clicking on the name of the level set.
 <p/>
 
@@ -65,15 +65,15 @@ by left/right clicking on the difficulty button.
 
 <b> Tip: </b> You can even customize the appearance of your ball here
 by left and right clicking on it. Try clicking until you have a good
-looking ball. 
+looking ball.
 
 <h3> 2.1 - Playing the game </h3>
 
 Once you are in the game you will see the first level. To actually
-start playing press the spacebar key. You can now move around you ball
-using either the mouse, the keyboard arrows (or nummerical keyboard)
-or by using a joystick if you had configured that in the settings
-screen. 
+start playing press the spacebar key. You can now move around the ball
+using either the mouse, the four arrow keys, the numerical keyboard,
+the QWAS keys, or by using a joystick if you had configured that in the
+settings screen. If you get stuck, press 'k' to restart with one life less.
 <p/>
 
 The goal of the game is to get points while moving through the
diff --git a/docs/mapeditor.html b/docs/mapeditor.html
index 207548e..64fd906 100644
--- a/docs/mapeditor.html
+++ b/docs/mapeditor.html
@@ -82,7 +82,7 @@ To start the map editor in trackballs press the "map editor" button in the begin
 KEYS/B></b></p>
 </td>
 <td valign="top">
-<p>Moves the cursor to another square on the grid.
+<p>Moves the cursor to a neighboring square on the grid. Combine with CTRL to jump 20 cells each time.
 <br>   </p>
 </td>
 </tr>
@@ -120,37 +120,37 @@ KEYS/B></b></p>
 </tr>
 <tr>
 <td valign="top">
-<p><b>C</b></p>
+<p><b>B</b></p>
 </td>
 <td valign="top">
-<p>Toggles crosshair view.
+<p>Toggles <tt>Birds-Eye View</tt> mode.
 <br> </p>
 </td>
 </tr>
 <tr>
 <td valign="top">
-<p><b>B</b></p>
+<p><b>L</b></p>
 </td>
 <td valign="top">
-<p>Toggles <tt>Birds-Eye View</tt> mode.
+<p>Loads the objects from the .scm file corresponding to the level into the editor. Script actions altering map cell properties will be ignored. The objects will be frozen at their initial location.
 <br> </p>
 </td>
 </tr>
 <tr>
 <td valign="top">
-<p><b>L</b></p>
+<p><b>C</b></p>
 </td>
 <td valign="top">
-<p>Loads the objects from the .scm file corresponding to the level into the editor. Script actions altering map cell properties will be ignored. The objects will be frozen at their initial location.
+<p>Clear loaded objects if there are any.
 <br> </p>
 </td>
 </tr>
 <tr>
 <td valign="top">
-<p><b>V</b></p>
+<p><b>R</b></p>
 </td>
 <td valign="top">
-<p>Rotates camera viewpoint 180 degrees.
+<p>Rotates camera viewpoint 90 degrees, if the View menu is open. 
 <br> </p>
 </td>
 </tr>
diff --git a/docs/scriptingLanguage.html b/docs/scriptingLanguage.html
index 933a4a1..99be784 100644
--- a/docs/scriptingLanguage.html
+++ b/docs/scriptingLanguage.html
@@ -21,23 +21,23 @@
 <div class="pagebody">
 <h1> The Scripting Language </h1>
 
-In the <tt>.scm</tt> files of a level the designer can use a powerfull
+In the <tt>.scm</tt> files of a level the designer can use a powerful
 scripting language to decide which objects should exist in the game
 and, optionally, even customize how they should behave. Using these
 features it is possible to create very different kind of games.
 <p/>
 
-The scripting language choosen for this is called 
+The scripting language chosen for this is called 
 <a href="http://www.gnu.org/software/guile/guile.html"> Guile </a> and is a
 language developed by <a href="http://www.gnu.org/"> GNU </a> to be
 used for customizing applications. The language is a version of 
 <a href="http://en.wikipedia.org/wiki/Scheme_(programming_language)">
 Scheme </a> and on a first appearance seems to constructed by lots of
-incredibly silly paranthesis (LISP). 
+incredibly silly parenthesis (LISP). 
 <p/>
 
 The easiest way to get started with the language is by copying an
-existing .scm file and cusotmize it for your new map. We start by
+existing .scm file and customize it for your new map. We start by
 taking a look at, for instance, <tt>con1.scm</tt>.
 <p/>
 
@@ -70,16 +70,16 @@ Following this is a number of function calls which use some of the
 built-in functions in trackballs to setup the settings for this level
 and to create objects. The first of these function calls are the
 "set-track-name" function. As you can see all function calls must be
-encapsulated by paranthesis (that's how scheme knows they are
+encapsulated by parenthesis (that's how scheme knows they are
 functions and not variables or values) and this first function expects
 one argument. In this example it is given the argument "Steep" which
-is the name of the level. Similarily the function "set-author" is used
+is the name of the level. Similarly the function "set-author" is used
 to tell trackballs whom has created this level. These two pieces of
-information is used in the begining of the level to give proper credit
+information is used in the beginning of the level to give proper credit
 to you, the author!
 <p/>
 
-Some other intersting functions you see here is the one to decide how
+Some other inter sting functions you see here is the one to decide how
 much time the player has to complete the level, start-time, expressed
 as seconds,  and where he starts. The later function,
 set-start-position, expects the x and y position for where the player
@@ -91,13 +91,13 @@ precisely decide exactly where in the cell to start.
 
 The next function, add-goal, expresses where the goal for this level
 is placed and expects x/y coordinates again and a true or false value
-if the goal should be horizontal or vertial (use #f or #t) and finally
+if the goal should be horizontal or vertical (use #f or #t) and finally
 the file name of the next level to go to.
 <p/>
 
 The remaining functions, add-flag and add-modpill, are used to create
 some objects in the game. In this case flags which gives points and a
-modpill which makes the player capable of jumping futher. See the 
+modpill which makes the player capable of jumping further. See the 
 <a href="api.html"> API Reference </a> for more information about
 these and other functions.
 <p/>
@@ -108,7 +108,7 @@ as constant values to be passed to functions. One example was the
 variable <tt> *mod-jump* </tt> which declared which kind of bonus pill
 was created in the example above. 
 
-<h3> Programming in scheme </h3>
+<h3> Programming in Scheme </h3>
 
 If you want to do more fancy setup in you levels, perhaps selecting
 starting time and position depending on the difficulty settings or
@@ -123,7 +123,7 @@ by examining examples.
 
 Apart from using the predefined functions and variables in trackballs
 you can create your own. This is good since it allows you to simplify
-the code for doing complex repetetive things. For instance, if you
+the code for doing complex repetitive things. For instance, if you
 want to create an opponent ball with a customized colour you can do so
 by doing:
 <p/>
@@ -151,13 +151,13 @@ and use this function repeatedly.
 (new-erik 200.0 200.0)
 </pre>
 
-Another more usefull way of using functions is to have them as "hooks"
+Another more useful way of using functions is to have them as "hooks"
 which get called by the game when different events occur. There exists
 a number of different functions with which you can create a hook which
 calls one of your functions when something happens in the
 game. Depending on on which event you have your function called your
 function may need different number of arguments. For instance, if we
-want to create modpill when an opponent "mr-black" gets killed
+want to create a modpill when an opponent "mr-black" gets killed
 we can do this by first creating a function to be called:
 <pre>
 (define my-modpill-function (subject object)
@@ -178,7 +178,7 @@ opponents gets killed we need to tell Trackballs to use it:
 (on-event *death* erik my-modpill-function)
 </pre>
 
-Congratulations, you now know the basic steps on how to completly
+Congratulations, you now know the basic steps on how to completely
 customize the game. By using your own functions and hooks which plug
 in to different parts of the game (like when objects get killed, or
 the player is close to a switch, or whatever) you can accomplish
@@ -188,7 +188,7 @@ functions, variables and hooks are available to you and take a look at
 the <a href="examples.html"> Examples </a> to get you started. If you
 have any great ideas for extra hooks or functions that are needed in
 the game please post a request at the <a
-href="http://sourceforge.net/forum/forum.php?forum_id=252194"> forums
+href="https://github.com/trackballs/trackballs/issues"> issue tracker
 </a> and we'll see what we can do.
 
 </div>
diff --git a/po/de.po b/po/de.po
index 1f421cf..16059b2 100644
--- a/po/de.po
+++ b/po/de.po
@@ -7,8 +7,8 @@ msgid ""
 msgstr ""
 "Project-Id-Version: v1.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-14 23:50-0400\n"
-"PO-Revision-Date: 2017-10-16 09:45-0400\n"
+"POT-Creation-Date: 2018-03-10 17:16-0500\n"
+"PO-Revision-Date: 2018-03-10 18:26-0500\n"
 "Last-Translator: Mathias <matbr at home.se>\n"
 "Language-Team: Swedish <sv at li.org>\n"
 "Language: de\n"
@@ -16,7 +16,7 @@ msgstr ""
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
 "Plural-Forms: nplurals=2; plural=(n != 1);\n"
-"X-Generator: Poedit 2.0.4\n"
+"X-Generator: Poedit 2.0.6\n"
 
 #: ../src/calibrateJoystickMode.cc:105
 msgid "Calibrating Joystick"
@@ -65,378 +65,378 @@ msgid "Save point"
 msgstr "Speicherpunkt"
 
 #. TRANSLATORS: This is a list of all the menus in the map editor.
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "File"
 msgstr "Datei"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Edit"
 msgstr "Bearbeiten"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Color"
 msgstr "Farbe"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Flags"
 msgstr "Flaggen"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Feature"
 msgstr "Eigenschaften"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Repair"
 msgstr "Reparieren"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Move"
 msgstr "Bewegen"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Window"
 msgstr "Fenster"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "View"
 msgstr "Ansicht"
 
 #. TRANSLATORS: This is a list of all the submenus in the map
 #. editor, if the initial character is * or / then that character
 #. must be perserved as it is.
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "New"
 msgstr "Neu"
 
-#: ../src/editMode.cc:176 ../src/editWindows.cc:480
+#: ../src/editMode.cc:178 ../src/editWindows.cc:482
 msgid "Open"
 msgstr "Öffnen"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Close"
 msgstr "Schließen"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Save"
 msgstr "Speichern"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Exit"
 msgstr "Beenden"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Test level"
 msgstr "Niveau ausprobieren"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit height"
 msgstr "Höhe bearbeiten"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit color"
 msgstr "Farbe bearbeiten"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit water"
 msgstr "Wasser bearbeiten"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit velocity"
 msgstr "Geschwindigkeit bearbeiten"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit lines"
 msgstr "Linien bearbeiten"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "*<SPACE> Whole cell"
 msgstr "* <LEERTASTE> Ganze Zelle"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Upper corner"
 msgstr "Obere Ecke"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Bottom corner"
 msgstr "Untere Ecke"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Right corner"
 msgstr "Rechte Ecke"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Left corner"
 msgstr "Linke Ecke"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Center"
 msgstr "Mitte"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Raise increment"
 msgstr "Schrittweite erhöhen"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Lower increment"
 msgstr "Schrittweite erniedrigen"
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<SHIFT> reversed"
 msgstr "*<UMSCHALT> umgekehrt"
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<CTRL> walls"
 msgstr "*<STRG> Wände"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. red"
 msgstr "Erh. rot"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. green"
 msgstr "Erh. grün"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. blue"
 msgstr "Erh. blau"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. alpha"
 msgstr "Erh. alpha"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Ice"
 msgstr "Eis"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198 ../share/levels/lv2.scm:4
+#: ../src/editMode.cc:184 ../src/editMode.cc:200 ../share/levels/lv2.scm:4
 msgid "Acid"
 msgstr "Säure"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Sand"
 msgstr "Sand"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "Kill"
 msgstr "Tod"
 
-#: ../src/editMode.cc:182
+#: ../src/editMode.cc:184
 msgid "Bounce"
 msgstr "Feder"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "No grid"
 msgstr "Kein Gitter"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:200
+#: ../src/editMode.cc:184 ../src/editMode.cc:202
 msgid "Track"
 msgstr "Spur"
 
-#: ../src/editMode.cc:183 ../src/editMode.cc:200
+#: ../src/editMode.cc:185 ../src/editMode.cc:202
 msgid "Shade flat"
 msgstr "Flache Facetten"
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "Texture"
 msgstr "Textur"
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "ch. texture"
 msgstr "änd. Textur"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Spike"
 msgstr "Spitze"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Small hill"
 msgstr "Kleiner Hügel"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Medium hill"
 msgstr "Mittlerer Hügel"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Large hill"
 msgstr "Großer Hügel"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Huge hill"
 msgstr "Riesiger Hügel"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth small"
 msgstr "Kleine Glättung"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth large"
 msgstr "Große Glättung"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Cell cont."
 msgstr "Zellkontinuität"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Water cont."
 msgstr "Wasserkontinuität"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Color cont."
 msgstr "Farbenkontinuität"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Cell center"
 msgstr "Höhen hobeln"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Water center"
 msgstr "Wasser hobeln"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Color center"
 msgstr "Farben hobeln"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Cell round"
 msgstr "Höhen runden"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Water round"
 msgstr "Wasser runden"
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 msgid "Color round"
 msgstr "Farbe runden"
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 msgid "Vel. round"
 msgstr "Geschw. runden"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/UP Move up"
 msgstr "/AUF Nach oben"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/DOWN Move down"
 msgstr "/AB Nach unten"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/LEFT Move left"
 msgstr "/LINKS Nach links"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/RIGHT Move right"
 msgstr "/RECHTS Nach rechts"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map up"
 msgstr "Karte nach oben"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map down"
 msgstr "Karte nach unten"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map left"
 msgstr "Karte nach links"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map right"
 msgstr "Karte nach rechts"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "*<SHIFT> x5"
 msgstr "*<UMSCHALT> x5"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Set region marker"
 msgstr "Bereichsmarkierung setzen"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Clear marker"
 msgstr "Bereichsmarkierung löschen"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Copy region"
 msgstr "Bereich copieren"
 
-#: ../src/editMode.cc:192
+#: ../src/editMode.cc:194
 msgid "Paste region"
 msgstr "Bereich einfügen"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Editor"
 msgstr "Karteneditor"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Toolbar"
 msgstr "Symbolleiste"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Status"
 msgstr "Status"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Birds's eye"
 msgstr "Vogelperspektive"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Rotate view"
 msgstr "Ansicht drehen"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Load entities"
 msgstr "Objekte laden"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Clear entities"
 msgstr "Objekte löschen"
 
-#: ../src/editMode.cc:199
+#: ../src/editMode.cc:201
 msgid "Trampoline"
 msgstr "Trampolin"
 
-#: ../src/editMode.cc:204
+#: ../src/editMode.cc:206
 msgid "Small smooth"
 msgstr "Kleine Glättung"
 
-#: ../src/editMode.cc:205
+#: ../src/editMode.cc:207
 msgid "Large smooth"
 msgstr "Große Glättung"
 
-#: ../src/editMode.cc:341 ../src/mainMode.cc:178
+#: ../src/editMode.cc:343 ../src/mainMode.cc:175
 msgid "Track:"
 msgstr "Strecke:"
 
-#: ../src/editMode.cc:342
+#: ../src/editMode.cc:344
 msgid "This is the default script file for this track."
 msgstr "Dies ist die Standard-Skriptdatei für diese Ebene."
 
-#: ../src/editMode.cc:344
+#: ../src/editMode.cc:346
 msgid "Read the documentation for the editor and look at the examples"
 msgstr "Lesen Sie die Dokumentation für den Editor und sehen Sie sich die"
 
-#: ../src/editMode.cc:345
+#: ../src/editMode.cc:347
 msgid "to learn how to customize it"
 msgstr "Beispiele an, um zu erfahren, wie Sie die Ebene anpassen können"
 
-#: ../src/editMode.cc:348
+#: ../src/editMode.cc:350
 msgid "Enter your name here"
 msgstr "Namen eingeben"
 
-#: ../src/editMode.cc:352
+#: ../src/editMode.cc:354
 msgid "Add the name of the next level here"
 msgstr "Fügen Sie hier den Namen der nächsten Ebene hinzu"
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell height"
 msgstr "Zellenhöhe"
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell water height"
 msgstr "Zellwasserhöhe"
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Textures"
 msgstr "Texturen"
 
@@ -529,71 +529,72 @@ msgstr "dy: %2.2f"
 msgid "Lines"
 msgstr "Linien"
 
-#: ../src/editWindows.cc:302
+#: ../src/editWindows.cc:304
 msgid "spike"
 msgstr "Spitze"
 
-#: ../src/editWindows.cc:305
+#: ../src/editWindows.cc:307
 msgid "small hill"
 msgstr "kleiner Hügel"
 
-#: ../src/editWindows.cc:308
+#: ../src/editWindows.cc:310
 msgid "medium hill"
 msgstr "mittlerer Hügel"
 
-#: ../src/editWindows.cc:311
+#: ../src/editWindows.cc:313
 msgid "large hill"
 msgstr "großer Hügel"
 
-#: ../src/editWindows.cc:314
+#: ../src/editWindows.cc:316
 msgid "huge hill"
 msgstr "riesiger Hügel"
 
-#: ../src/editWindows.cc:317
+#: ../src/editWindows.cc:319
 msgid "small smooth"
 msgstr "kleine Glättung"
 
-#: ../src/editWindows.cc:320
+#: ../src/editWindows.cc:322
 msgid "large smooth"
 msgstr "große Glättung"
 
-#: ../src/editWindows.cc:360
+#: ../src/editWindows.cc:362
 msgid "Quit without saving?"
 msgstr "Beenden ohne zu speichern?"
 
-#: ../src/editWindows.cc:361 ../src/editWindows.cc:400
-#: ../src/editWindows.cc:447 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:177
-#: ../src/settingsMode.cc:179 ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:363 ../src/editWindows.cc:402
+#: ../src/editWindows.cc:449 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:180 ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:243
 msgid "Yes"
 msgstr "Ja"
 
-#: ../src/editWindows.cc:362 ../src/editWindows.cc:401
-#: ../src/editWindows.cc:448 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:138
-#: ../src/settingsMode.cc:177 ../src/settingsMode.cc:179
-#: ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:364 ../src/editWindows.cc:403
+#: ../src/editWindows.cc:450 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:139
+#: ../src/settingsMode.cc:178 ../src/settingsMode.cc:180
+#: ../src/settingsMode.cc:194 ../src/settingsMode.cc:243
 #, c-format
 msgid "No"
 msgstr "Nein"
 
-#: ../src/editWindows.cc:399
+#: ../src/editWindows.cc:401
 msgid "Save map?"
 msgstr "Karte abspeichern?"
 
-#: ../src/editWindows.cc:403
+#: ../src/editWindows.cc:405
 msgid "Saving"
 msgstr "Speichern"
 
-#: ../src/editWindows.cc:446
+#: ../src/editWindows.cc:448
 msgid "Close without saving?"
 msgstr "Schließen ohne zu speichern?"
 
-#: ../src/editWindows.cc:477
+#: ../src/editWindows.cc:479
 msgid "Name of map"
 msgstr "Name der Karte"
 
-#: ../src/editWindows.cc:479 ../src/editWindows.cc:536
+#: ../src/editWindows.cc:481 ../src/editWindows.cc:536
 msgid "Cancel"
 msgstr "Absagen"
 
@@ -624,17 +625,17 @@ msgstr "Namen eingeben: %s"
 msgid "John Doe"
 msgstr "Peter Schmidt"
 
-#: ../src/glHelp.cc:1264
+#: ../src/glHelp.cc:1258
 #, c-format
 msgid "Framerate: %.1f"
 msgstr "Bildrate: %.1f"
 
-#: ../src/glHelp.cc:1266
+#: ../src/glHelp.cc:1260
 #, c-format
 msgid "Framerate unknown"
 msgstr "Unbekannte Bildrate"
 
-#: ../src/glHelp.cc:1268
+#: ../src/glHelp.cc:1262
 #, c-format
 msgid "%.1f ms/Frame"
 msgstr "%.1f ms/Bild"
@@ -821,15 +822,10 @@ msgstr "Transportiert Sie, manchmal mit großer Geschwindigkeit."
 msgid "More Help"
 msgstr "Mehr Hilfe"
 
-#: ../src/helpMode.cc:287 ../src/hofMode.cc:107 ../src/settingsMode.cc:242
+#: ../src/helpMode.cc:287 ../src/hofMode.cc:110 ../src/settingsMode.cc:254
 msgid "Back"
 msgstr "Zurück"
 
-#: ../src/highScore.cc:39
-#, c-format
-msgid "Anonymous Coward"
-msgstr "Anonymer Feigling"
-
 #: ../src/hofMode.cc:89
 msgid "High Scores"
 msgstr "Highscores"
@@ -838,122 +834,124 @@ msgstr "Highscores"
 msgid "Level Set"
 msgstr "Niveaumenge"
 
-#: ../src/hofMode.cc:101
+#: ../src/hofMode.cc:100
+msgid "Anonymous Coward"
+msgstr "Anonymer Feigling"
+
+#: ../src/hofMode.cc:104
 #, c-format
 msgid "%d points"
 msgstr "%d Punkte"
 
-#: ../src/mainMode.cc:180
+#: ../src/mainMode.cc:179 ../src/setupMode.cc:227
+msgid "Unknown track"
+msgstr "Unbekannte Strecke"
+
+#: ../src/mainMode.cc:181
 msgid "Author:"
 msgstr "Autor:"
 
-#: ../src/mainMode.cc:182
+#: ../src/mainMode.cc:185
+msgid "Unknown author"
+msgstr "Unbekannter Autor"
+
+#: ../src/mainMode.cc:187
 msgid "Press spacebar to begin"
 msgstr "Drücken Sie den Platz, um zu beginnen"
 
-#: ../src/mainMode.cc:194 ../src/mainMode.cc:203 ../src/mainMode.cc:229
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:199 ../src/mainMode.cc:208 ../src/mainMode.cc:234
+#: ../src/mainMode.cc:248
 #, c-format
 msgid "Press spacebar to continue"
 msgstr "Drücken Sie den Platz, um fortzufahren"
 
-#: ../src/mainMode.cc:195
+#: ../src/mainMode.cc:200
 msgid "Game over"
 msgstr "Spiel ist aus"
 
-#: ../src/mainMode.cc:203
+#: ../src/mainMode.cc:208
 msgid "Oops"
 msgstr "Hoppla"
 
-#: ../src/mainMode.cc:220
+#: ../src/mainMode.cc:225
 msgid "Paused"
 msgstr "Pausiert"
 
-#: ../src/mainMode.cc:229
+#: ../src/mainMode.cc:234
 msgid "Bonus level complete"
 msgstr "Bonuslevel geschafft"
 
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:248
 msgid "Level complete"
 msgstr "Level geschafft"
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "Congratulations"
 msgstr "Herzlichen Glückwunsch"
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "You have completed the game!"
 msgstr "Sie haben das Spiel beendet!"
 
-#: ../src/mainMode.cc:542 ../src/mainMode.cc:558
+#: ../src/mainMode.cc:546 ../src/mainMode.cc:561
 msgid "Good luck!"
 msgstr "Viel Glück!"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Lives"
 msgstr "Leben"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Score"
 msgstr "Punkte"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Time left"
 msgstr "Zeit"
 
-#: ../src/mainMode.cc:653
+#: ../src/mainMode.cc:656
 #, c-format
 msgid "Level bonuses"
 msgstr "Bonus"
 
-#: ../src/mainMode.cc:655
+#: ../src/mainMode.cc:658
 #, c-format
 msgid "Lives left:"
 msgstr "Leben übrig:"
 
-#: ../src/mainMode.cc:656
+#: ../src/mainMode.cc:659
 #, c-format
 msgid "%d x 100 = %d points"
 msgstr "%d x 100 = %d Punkte"
 
-#: ../src/mainMode.cc:657
+#: ../src/mainMode.cc:660
 #, c-format
 msgid "Time left:"
 msgstr "Zeit übrig:"
 
-#: ../src/mainMode.cc:658
+#: ../src/mainMode.cc:661
 #, c-format
 msgid "%d minutes = %d points"
 msgstr "%d Minuten = %d Punkte"
 
-#: ../src/mainMode.cc:660
+#: ../src/mainMode.cc:663
 #, c-format
 msgid "Difficulty:"
 msgstr "Schwierigkeit:"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "easy"
 msgstr "leicht"
 
-#: ../src/mainMode.cc:662 ../src/settingsMode.cc:199
+#: ../src/mainMode.cc:665 ../src/settingsMode.cc:204
 #, c-format
 msgid "normal"
 msgstr "normal"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "hard"
 msgstr "schwierig"
 
-#: ../src/map.cc:252
-#, c-format
-msgid "Unknown track"
-msgstr "Unbekannte Strecke"
-
-#: ../src/map.cc:253
-#, c-format
-msgid "Unknown author"
-msgstr "Unbekannter Autor"
-
 #: ../src/menuMode.cc:70
 msgid ""
 "Trackballs is a game similar to the classical game Marble Madness from the "
@@ -997,322 +995,334 @@ msgstr "Hilfe"
 msgid "Map Editor"
 msgstr "Karteneditor"
 
-#: ../src/mmad.cc:214
+#: ../src/mmad.cc:213
 msgid "Usage:"
 msgstr "Verwendung:"
 
-#: ../src/mmad.cc:215
+#: ../src/mmad.cc:214
 msgid "[-w, -m] [-e, -l -t <level>] [-r <width>] [-s <sensitivity>]"
 msgstr "[-w, -m] [-e, -l -t <Ebene>] [-r <Breite>] [-s <Empfindlichkeit>]"
 
-#: ../src/mmad.cc:217
+#: ../src/mmad.cc:216
 msgid "Display this usage information."
 msgstr "Zeige diese Verwendungsinformationen an."
 
-#: ../src/mmad.cc:218
+#: ../src/mmad.cc:217
 msgid "Start from level."
 msgstr "Beginne mit Level."
 
-#: ../src/mmad.cc:219
+#: ../src/mmad.cc:218
 msgid "Run in window (Default is fullscreen)"
 msgstr "Im Fenster ausführen (Standard ist Vollbild)"
 
-#: ../src/mmad.cc:220
+#: ../src/mmad.cc:219
 msgid "Mute sound."
 msgstr "Ton stummschalten."
 
-#: ../src/mmad.cc:221
+#: ../src/mmad.cc:220
 msgid "Set resolution to 640, 800 or 1024"
 msgstr "Stelle die Auflösung auf 640, 800 oder 1024 ein"
 
-#: ../src/mmad.cc:222
+#: ../src/mmad.cc:221
 msgid "Mouse sensitivity, default 1.0"
 msgstr "Mausempfindlichkeit, Standardwert 1.0"
 
-#: ../src/mmad.cc:223
+#: ../src/mmad.cc:222
 msgid "Displays framerate"
 msgstr "Zeigt die Bildrate an"
 
-#: ../src/mmad.cc:224
+#: ../src/mmad.cc:223
 msgid "Prints current version number"
 msgstr "Druckt die aktuelle Versionsnummer"
 
-#: ../src/mmad.cc:225
+#: ../src/mmad.cc:224
 msgid "Updates a map to the latest format"
 msgstr "Aktualisiert eine Karte auf das neueste Format"
 
-#: ../src/mmad.cc:226
+#: ../src/mmad.cc:225
 msgid "Attempt to conserve memory usage"
 msgstr "Speicherverbrauch sparen"
 
-#: ../src/mmad.cc:227
+#: ../src/mmad.cc:226
 msgid "Debug joystick status"
 msgstr "Joystick debuggen"
 
-#: ../src/mmad.cc:228
+#: ../src/mmad.cc:227
 msgid "Correct for bad joysticks"
 msgstr "Schlechte Joysticks korrigieren"
 
-#: ../src/mmad.cc:232
+#: ../src/mmad.cc:231
 msgid "Important keyboard shortcuts"
 msgstr "Wichtige Tastenkürzel"
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Escape"
 msgstr "Escape"
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Soft quit"
 msgstr "Weich beenden"
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "CapsLock"
 msgstr "Feststell"
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "Unhide mouse pointer"
 msgstr "Mauszeiger sichtbar machen"
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "CTRL-q"
 msgstr "STRG-q"
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "Quit the game immediately"
 msgstr "Sofort beenden"
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "CTRL-f"
 msgstr "STRG-f"
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "Toggle between fullscreen/windowed mode"
 msgstr "Zwischen Vollbildmodus und Fenstermodus wechseln"
 
-#: ../src/mmad.cc:237
+#: ../src/mmad.cc:236
 msgid "Kill the ball"
 msgstr "Ball töten"
 
-#: ../src/mmad.cc:349
+#: ../src/mmad.cc:342
 #, c-format
 msgid "Unknown screen resolution of width %d"
 msgstr "Unbekannte Bildschirmauflösung der Breite %d"
 
-#: ../src/mmad.cc:382
+#: ../src/mmad.cc:375
 msgid "Welcome to Trackballs."
 msgstr "Willkommen bei Trackballs."
 
-#: ../src/mmad.cc:384
+#: ../src/mmad.cc:377
 #, c-format
 msgid "Using %s as gamedata directory."
 msgstr "Mit %s als Spieldaten-Verzeichnis."
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Speed ball"
 msgstr "Geschwindigkeits ball"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Extra jump"
 msgstr "Extra-Sprung"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Spikes"
 msgstr "Stacheln"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Glass ball"
 msgstr "Glasball"
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Dizzy!"
 msgstr "Schwindlig!"
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Freeze!"
 msgstr "Einfrieren!"
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Floating"
 msgstr "Schwimmend"
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Extra life"
 msgstr "Extra Leben"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Small ball"
 msgstr "Kleiner Ball"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Large ball"
 msgstr "Großer Ball"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Nitro"
 msgstr "Nitro"
 
-#: ../src/settingsMode.cc:84
+#: ../src/settingsMode.cc:85
 msgid "Game Settings"
 msgstr "Spielkonfiguration"
 
-#: ../src/settingsMode.cc:94
+#: ../src/settingsMode.cc:95
 #, c-format
 msgid "Is resolution %dx%dx%d ok?"
 msgstr "Ist die Auflösung %dx%dx%d in Ordnung?"
 
-#: ../src/settingsMode.cc:97
+#: ../src/settingsMode.cc:98
 #, c-format
 msgid "Is resolution Auto-%d ok?"
 msgstr "Ist die Auflösung Auto-%d in Ordnung?"
 
-#: ../src/settingsMode.cc:101
+#: ../src/settingsMode.cc:102
 msgid "Ok, use this resolution"
 msgstr "Ja, verwende diese Auflösung"
 
-#: ../src/settingsMode.cc:102
+#: ../src/settingsMode.cc:103
 msgid "No, revert to old resolution"
 msgstr "Nein, zur alten Auslosung zurückkehren"
 
-#: ../src/settingsMode.cc:104
+#: ../src/settingsMode.cc:105
 #, c-format
 msgid "Timeout in %d seconds"
 msgstr "Timeout in %d Sekunden"
 
-#: ../src/settingsMode.cc:116
+#: ../src/settingsMode.cc:117
 msgid "Video"
 msgstr "Video"
 
-#: ../src/settingsMode.cc:123
+#: ../src/settingsMode.cc:124
 #, c-format
 msgid "Auto-%d"
 msgstr "Auto-%d"
 
-#: ../src/settingsMode.cc:125
+#: ../src/settingsMode.cc:126
 msgid "Resolution"
 msgstr "Auflösung"
 
-#: ../src/settingsMode.cc:126
+#: ../src/settingsMode.cc:127
 msgid "Test this resolution"
 msgstr "Auflösung testen"
 
-#: ../src/settingsMode.cc:129
+#: ../src/settingsMode.cc:130
 msgid "Fullscreen"
 msgstr "Vollbild"
 
-#: ../src/settingsMode.cc:132
+#: ../src/settingsMode.cc:133
 msgid "VSync"
 msgstr "VSync"
 
-#: ../src/settingsMode.cc:141
+#: ../src/settingsMode.cc:142
 #, c-format
 msgid "Frame rate"
 msgstr "Bildrate"
 
-#: ../src/settingsMode.cc:144
+#: ../src/settingsMode.cc:145
 #, c-format
 msgid "Frame time"
 msgstr "Bildzeit"
 
-#: ../src/settingsMode.cc:147
+#: ../src/settingsMode.cc:148
 msgid "Show FPS"
 msgstr "FPS anzeigen"
 
-#: ../src/settingsMode.cc:152
+#: ../src/settingsMode.cc:153
 msgid "Graphics"
 msgstr "Detailstufe"
 
-#: ../src/settingsMode.cc:157
+#: ../src/settingsMode.cc:158
 #, c-format
 msgid "None"
 msgstr "Nichts"
 
-#: ../src/settingsMode.cc:160
+#: ../src/settingsMode.cc:161
 #, c-format
 msgid "Minimalistic"
 msgstr "Minimalistisch"
 
-#: ../src/settingsMode.cc:163
+#: ../src/settingsMode.cc:164
 #, c-format
 msgid "Simple"
 msgstr "Einfach"
 
-#: ../src/settingsMode.cc:166
+#: ../src/settingsMode.cc:167
 #, c-format
 msgid "Standard"
 msgstr "Standard"
 
-#: ../src/settingsMode.cc:169
+#: ../src/settingsMode.cc:170
 #, c-format
 msgid "Extra"
 msgstr "Extra"
 
-#: ../src/settingsMode.cc:172
+#: ../src/settingsMode.cc:173
 #, c-format
 msgid "Everything"
 msgstr "Alles"
 
-#: ../src/settingsMode.cc:175
+#: ../src/settingsMode.cc:176
 msgid "Details"
 msgstr "Details"
 
-#: ../src/settingsMode.cc:176
+#: ../src/settingsMode.cc:177
 msgid "Reflections"
 msgstr "Reflexionen"
 
-#: ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:179
 msgid "Shadows"
 msgstr "Schatten"
 
-#: ../src/settingsMode.cc:185
+#: ../src/settingsMode.cc:183
+msgid "Shadow Resolution"
+msgstr "Schattenauflösung"
+
+#: ../src/settingsMode.cc:190
 msgid "Controls"
 msgstr "Kontrollen"
 
-#: ../src/settingsMode.cc:188
+#: ../src/settingsMode.cc:193
 msgid "Use mouse"
 msgstr "Maus benutzen"
 
-#: ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:199
 msgid "Sensitivity"
 msgstr "Empfindlichkeit"
 
-#: ../src/settingsMode.cc:201
+#: ../src/settingsMode.cc:206
 #, c-format
 msgid "+%d degrees"
 msgstr "+%d Grad"
 
-#: ../src/settingsMode.cc:203
+#: ../src/settingsMode.cc:208
 #, c-format
 msgid "-%d degrees"
 msgstr "-%d Grad"
 
-#: ../src/settingsMode.cc:204
+#: ../src/settingsMode.cc:209
 msgid "Steering"
 msgstr "Steuerung"
 
-#: ../src/settingsMode.cc:211
+#: ../src/settingsMode.cc:216
 #, c-format
 msgid "no joystick found"
 msgstr "kein Joystick gefunden"
 
-#: ../src/settingsMode.cc:215
+#: ../src/settingsMode.cc:220
 msgid "Joystick:"
 msgstr "Joystick:"
 
-#: ../src/settingsMode.cc:225
+#: ../src/settingsMode.cc:230
 msgid "Other"
 msgstr "Weiteres"
 
-#: ../src/settingsMode.cc:229
+#: ../src/settingsMode.cc:233
+msgid "Language"
+msgstr "Sprache"
+
+#: ../src/settingsMode.cc:237
 msgid "Music volume"
 msgstr "Musiklautstärke"
 
-#: ../src/settingsMode.cc:231
+#: ../src/settingsMode.cc:239
 msgid "Effects volume"
 msgstr "Effektlautstärke"
 
-#: ../src/settingsMode.cc:233
-msgid "Language"
-msgstr "Sprache"
+#: ../src/settingsMode.cc:242
+msgid "Sandbox mode available"
+msgstr "Sandbox-Modus verfügbar"
+
+#: ../src/settingsMode.cc:246
+msgid "Time Compression"
+msgstr "Zeitkomprimierung"
 
 #: ../src/setupMode.cc:203
 msgid "Setup new game"
@@ -1330,55 +1340,55 @@ msgstr "N/A"
 msgid "Level"
 msgstr "Spielniveau"
 
-#: ../src/setupMode.cc:228
+#: ../src/setupMode.cc:231
 msgid "Difficulty"
 msgstr "Schwierigkeit"
 
-#: ../src/setupMode.cc:232
+#: ../src/setupMode.cc:235
 msgid "Sandbox (Easy)"
 msgstr "Sandkasten (Leicht)"
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Normal)"
 msgstr "Sandkasten (Normal)"
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Hard)"
 msgstr "Sandkasten (Schwierig)"
 
-#: ../src/setupMode.cc:235
+#: ../src/setupMode.cc:238
 msgid "Easy"
 msgstr "Leicht"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Normal"
 msgstr "Normal"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Hard"
 msgstr "Schwierig"
 
-#: ../src/setupMode.cc:241
+#: ../src/setupMode.cc:244
 #, c-format
 msgid "Total games played: %d"
 msgstr "Anzahl Spiele gespielt: %d"
 
-#: ../src/setupMode.cc:245
+#: ../src/setupMode.cc:248
 #, c-format
 msgid "Average score: %d"
 msgstr "Durchschnittliche Punktzahl: %d"
 
-#: ../src/setupMode.cc:247
+#: ../src/setupMode.cc:250
 #, c-format
 msgid "Average score: N/A"
 msgstr "Durchschnittliche Punktzahl: nd"
 
-#: ../src/setupMode.cc:250
+#: ../src/setupMode.cc:253
 #, c-format
 msgid "Levels completed: %d"
 msgstr "Level abgeschlossen: %d"
 
-#: ../src/setupMode.cc:262
+#: ../src/setupMode.cc:269
 msgid "Start Game"
 msgstr "Spiel beginnen"
 
@@ -1422,8 +1432,7 @@ msgstr "Trauen Sie sich, diese vier Burgen zu betreten? Nur die erfahrensten"
 
 #: ../share/levels/castles.set:5
 msgid "experienced and skilled Trackballs players will make it as far"
-msgstr ""
-" und geschicktesten Trackballspieler werden es bis zur härtesten Burg "
+msgstr " und geschicktesten Trackballspieler werden es bis zur härtesten Burg "
 
 #: ../share/levels/castles.set:6
 msgid "as to the thoughest Ice and Glass castle - a place where you may"
@@ -1490,6 +1499,18 @@ msgstr "Eine seltsame Reihe von Ebenen mit einem seltsamen Namen -"
 msgid "All made by Francek."
 msgstr "Alles von Francek gemacht."
 
+#: ../share/levels/ds.set:1
+msgid "Don't stop"
+msgstr "Nicht anhalten!"
+
+#: ../share/levels/ds.set:3 ../share/levels/ds1.scm:3
+msgid "Principia"
+msgstr "Principia"
+
+#: ../share/levels/ds.set:4
+msgid "Or stay still and see what happens!"
+msgstr "Oder bleibe und schaue was passiert!"
+
 #: ../share/levels/elite.set:1
 msgid "Elite"
 msgstr "Elite"
@@ -1541,8 +1562,7 @@ msgstr ""
 #: ../share/levels/frg.set:5
 msgid "Race down one of the many hills, and beat the time limit and avoid"
 msgstr ""
-"Rennen Sie einen der vielen Hügel hinunter, schlagen Sie die "
-"Zeitbegrenzung, "
+"Rennen Sie einen der vielen Hügel hinunter, schlagen Sie die Zeitbegrenzung, "
 
 #: ../share/levels/frg.set:6
 msgid "badguys and hazards. Can you finish all the nine levels?"
@@ -1698,15 +1718,15 @@ msgstr "Sprung, 200 Pt"
 msgid "Four Doors"
 msgstr "Vier Türen"
 
-#: ../share/levels/bx2.scm:293
+#: ../share/levels/bx2.scm:304
 msgid "4 hidden switches open exit doors."
 msgstr "4 versteckte Schalter öffnen Ausgangstüren."
 
-#: ../share/levels/bx2.scm:295
+#: ../share/levels/bx2.scm:306
 msgid "A switch is nearby."
 msgstr "Ein Schalter ist in der Nähe."
 
-#: ../share/levels/bx2.scm:297
+#: ../share/levels/bx2.scm:308
 msgid "Peace."
 msgstr "Frieden."
 
@@ -1714,35 +1734,35 @@ msgstr "Frieden."
 msgid "Azteca"
 msgstr "Azteken"
 
-#: ../share/levels/bx3.scm:107
+#: ../share/levels/bx3.scm:111
 msgid "You have access to the complex."
 msgstr "Sie haben Zugang zum Komplex."
 
-#: ../share/levels/bx3.scm:125
+#: ../share/levels/bx3.scm:129
 msgid "The way is opened across the sand."
 msgstr "Der Weg über den Sand ist geöffnet."
 
-#: ../share/levels/bx3.scm:135
+#: ../share/levels/bx3.scm:139
 msgid "You must enter the Arena."
 msgstr "Sie mussen die Arena betreten."
 
-#: ../share/levels/bx3.scm:195 ../share/levels/bx3.scm:202
+#: ../share/levels/bx3.scm:199 ../share/levels/bx3.scm:206
 msgid "A wall has been lowered."
 msgstr "Eine Mauer wurde abgesenkt."
 
-#: ../share/levels/bx3.scm:209
+#: ../share/levels/bx3.scm:213
 msgid "A roof has been raised."
 msgstr "Ein Dach wurde erhoben."
 
-#: ../share/levels/bx3.scm:225
+#: ../share/levels/bx3.scm:229
 msgid "Stairs are in place."
 msgstr "Treppen sind vorhanden."
 
-#: ../share/levels/bx3.scm:235
+#: ../share/levels/bx3.scm:239
 msgid "You may enter upper complex."
 msgstr "Sie können den oberen Komplex betreten."
 
-#: ../share/levels/bx3.scm:249
+#: ../share/levels/bx3.scm:252
 msgid "The exit is now open."
 msgstr "Der Ausgang ist jetzt offen."
 
@@ -1851,6 +1871,18 @@ msgstr "Nass werden!"
 msgid "Final and the last"
 msgstr "Das Finale und das letzte"
 
+#: ../share/levels/dn6.scm:37 ../share/levels/dn6.scm:73
+msgid "Switch twice"
+msgstr "Zweimal verwenden"
+
+#: ../share/levels/ds2.scm:3
+msgid "Orbit"
+msgstr "Orbit"
+
+#: ../share/levels/ds3.scm:3
+msgid "Tunnel"
+msgstr "Tunnel"
+
 #: ../share/levels/elite1.scm:3
 msgid "Castle of Darius the Mede"
 msgstr "Schloss von Darius der Mede"
@@ -1995,7 +2027,7 @@ msgstr "Chaos"
 msgid "The Castle"
 msgstr "Das Schloss"
 
-#: ../share/levels/mhm3.scm:24
+#: ../share/levels/mhm3.scm:15
 msgid "Stay on the path or else!"
 msgstr "Bleib auf dem Weg oder sonst!"
 
@@ -2067,15 +2099,15 @@ msgstr "Wasserstoff"
 msgid "The Marble HQ"
 msgstr "Das Murmelhauptquartier"
 
-#: ../share/levels/sl6.scm:203
+#: ../share/levels/sl6.scm:199
 msgid "The Marble HQ - Do not Enter!"
 msgstr "Das Murmelhauptquartier -- Kein Zutritt!"
 
-#: ../share/levels/sl6.scm:344
+#: ../share/levels/sl6.scm:340
 msgid "Bonus"
 msgstr "Bonus"
 
-#: ../share/levels/sl6.scm:526
+#: ../share/levels/sl6.scm:521
 msgid "Commander's Hall"
 msgstr "Kommandantenhalle"
 
diff --git a/po/fr.po b/po/fr.po
index 6a8a554..2f4cc6e 100644
--- a/po/fr.po
+++ b/po/fr.po
@@ -7,15 +7,15 @@ msgid ""
 msgstr ""
 "Project-Id-Version: fr\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-14 23:50-0400\n"
-"PO-Revision-Date: 2017-09-04 09:46-0400\n"
+"POT-Creation-Date: 2018-03-10 17:16-0500\n"
+"PO-Revision-Date: 2018-03-10 18:53-0500\n"
 "Last-Translator: Guillaume Bedot <littletux at zarb.org>\n"
 "Language-Team: Français >\n"
 "Language: fr\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
-"X-Generator: Poedit 2.0.3\n"
+"X-Generator: Poedit 2.0.6\n"
 
 #: ../src/calibrateJoystickMode.cc:105
 msgid "Calibrating Joystick"
@@ -64,378 +64,378 @@ msgid "Save point"
 msgstr "Point de sauvegarde"
 
 #. TRANSLATORS: This is a list of all the menus in the map editor.
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "File"
 msgstr "Fichier"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Edit"
 msgstr "Edition"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Color"
 msgstr "Couleur"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Flags"
 msgstr "Drapeaux"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Feature"
 msgstr "Caractéristique"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Repair"
 msgstr "Réparer"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Move"
 msgstr "Deplacer"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Window"
 msgstr "Fenêtre"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "View"
 msgstr "Vue"
 
 #. TRANSLATORS: This is a list of all the submenus in the map
 #. editor, if the initial character is * or / then that character
 #. must be perserved as it is.
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "New"
 msgstr "Nouveau"
 
-#: ../src/editMode.cc:176 ../src/editWindows.cc:480
+#: ../src/editMode.cc:178 ../src/editWindows.cc:482
 msgid "Open"
 msgstr "Ouvrir"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Close"
 msgstr "Fermer"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Save"
 msgstr "Enregistrer"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Exit"
 msgstr "Quitter"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Test level"
 msgstr "Tester le niveau"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit height"
 msgstr "Changer la hauteur"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit color"
 msgstr "Changer la couleur"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit water"
 msgstr "Changer l'eau"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit velocity"
 msgstr "Changer la vélocité"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit lines"
 msgstr "Changer les lignes"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "*<SPACE> Whole cell"
 msgstr "*<ESPACE> Toute la cellule"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Upper corner"
 msgstr "Coin du haut"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Bottom corner"
 msgstr "Coin du bas"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Right corner"
 msgstr "Coin de droite"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Left corner"
 msgstr "Coin de gauche"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Center"
 msgstr "Centre"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Raise increment"
 msgstr "Augmenter l'incrément"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Lower increment"
 msgstr "Diminuer l'incrément"
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<SHIFT> reversed"
 msgstr "*<SHIFT> inverser"
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<CTRL> walls"
 msgstr "*<CTRL> murs"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. red"
 msgstr "Aj. rouge"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. green"
 msgstr "Aj. vert"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. blue"
 msgstr "Aj. bleu"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. alpha"
 msgstr "Aj. alpha"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Ice"
 msgstr "Glace"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198 ../share/levels/lv2.scm:4
+#: ../src/editMode.cc:184 ../src/editMode.cc:200 ../share/levels/lv2.scm:4
 msgid "Acid"
 msgstr "Acide"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Sand"
 msgstr "Sable"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "Kill"
 msgstr "Tuer"
 
-#: ../src/editMode.cc:182
+#: ../src/editMode.cc:184
 msgid "Bounce"
 msgstr "Rebondir"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "No grid"
 msgstr "Pas de grille"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:200
+#: ../src/editMode.cc:184 ../src/editMode.cc:202
 msgid "Track"
 msgstr "Piste"
 
-#: ../src/editMode.cc:183 ../src/editMode.cc:200
+#: ../src/editMode.cc:185 ../src/editMode.cc:202
 msgid "Shade flat"
 msgstr "Ombrer plat"
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "Texture"
 msgstr "Texture"
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "ch. texture"
 msgstr "ch. texture"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Spike"
 msgstr "Pic"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Small hill"
 msgstr "Petite colline"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Medium hill"
 msgstr "Moyenne colline"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Large hill"
 msgstr "Grande colline"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Huge hill"
 msgstr "Énorme colline"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth small"
 msgstr "Petite surface lisse"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth large"
 msgstr "Grande surface lisse"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Cell cont."
 msgstr "Continuité de hauteur"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Water cont."
 msgstr "Continuité de l'eau"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Color cont."
 msgstr "Continuité de la couleur"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Cell center"
 msgstr "Centrer la hauteur"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Water center"
 msgstr "Centrer l'eau"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Color center"
 msgstr "Centrer la couleur"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Cell round"
 msgstr "Arrondir la hauteur"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Water round"
 msgstr "Arrondir l'eau"
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 msgid "Color round"
 msgstr "Arrondir la couleur"
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 msgid "Vel. round"
 msgstr "Arrondir la vélocité"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/UP Move up"
 msgstr "/HAUT Vers le haut"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/DOWN Move down"
 msgstr "/BAS Vers le bas"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/LEFT Move left"
 msgstr "/GAUCHE Vers la gauche"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/RIGHT Move right"
 msgstr "/DROITE Vers la droite"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map up"
 msgstr "Déplacer la carte vers le haut"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map down"
 msgstr "Déplacer la carte vers le bas"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map left"
 msgstr "Déplacer la carte vers la gauche"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map right"
 msgstr "Déplacer la carte vers la droite"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "*<SHIFT> x5"
 msgstr "*<SHIFT> x5"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Set region marker"
 msgstr "Définir le marqueur de region"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Clear marker"
 msgstr "Effacer le marqueur"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Copy region"
 msgstr "Copier la région"
 
-#: ../src/editMode.cc:192
+#: ../src/editMode.cc:194
 msgid "Paste region"
 msgstr "Coller la région"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Editor"
 msgstr "Éditeur"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Toolbar"
 msgstr "Barre d'outils"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Status"
 msgstr "Statut"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Birds's eye"
 msgstr "Oeil d'oiseaux"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Rotate view"
 msgstr "Tourner la vue"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Load entities"
 msgstr "Charger les entités"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Clear entities"
 msgstr "Effacer les entités"
 
-#: ../src/editMode.cc:199
+#: ../src/editMode.cc:201
 msgid "Trampoline"
 msgstr "Trampoline"
 
-#: ../src/editMode.cc:204
+#: ../src/editMode.cc:206
 msgid "Small smooth"
 msgstr "Petite surface lisse"
 
-#: ../src/editMode.cc:205
+#: ../src/editMode.cc:207
 msgid "Large smooth"
 msgstr "Grande surface lisse"
 
-#: ../src/editMode.cc:341 ../src/mainMode.cc:178
+#: ../src/editMode.cc:343 ../src/mainMode.cc:175
 msgid "Track:"
 msgstr "Piste:"
 
-#: ../src/editMode.cc:342
+#: ../src/editMode.cc:344
 msgid "This is the default script file for this track."
 msgstr "Ceci est le fichier de script par défaut pour cette piste."
 
-#: ../src/editMode.cc:344
+#: ../src/editMode.cc:346
 msgid "Read the documentation for the editor and look at the examples"
 msgstr "Lisez la documentation de l'éditeur et regardez les exemples"
 
-#: ../src/editMode.cc:345
+#: ../src/editMode.cc:347
 msgid "to learn how to customize it"
 msgstr "pour apprendre à le personnaliser"
 
-#: ../src/editMode.cc:348
+#: ../src/editMode.cc:350
 msgid "Enter your name here"
 msgstr "Entrez votre nom"
 
-#: ../src/editMode.cc:352
+#: ../src/editMode.cc:354
 msgid "Add the name of the next level here"
 msgstr "Ajoutez le nom du prochain niveau ici"
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell height"
 msgstr "Hauteur de la cellule"
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell water height"
 msgstr "Hauteur de la cellule d'eau"
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Textures"
 msgstr "Textures"
 
@@ -528,71 +528,72 @@ msgstr "dy: %2.2f"
 msgid "Lines"
 msgstr "Lignes"
 
-#: ../src/editWindows.cc:302
+#: ../src/editWindows.cc:304
 msgid "spike"
 msgstr "Pic"
 
-#: ../src/editWindows.cc:305
+#: ../src/editWindows.cc:307
 msgid "small hill"
 msgstr "Petite colline"
 
-#: ../src/editWindows.cc:308
+#: ../src/editWindows.cc:310
 msgid "medium hill"
 msgstr "Moyenne colline"
 
-#: ../src/editWindows.cc:311
+#: ../src/editWindows.cc:313
 msgid "large hill"
 msgstr "Grande colline"
 
-#: ../src/editWindows.cc:314
+#: ../src/editWindows.cc:316
 msgid "huge hill"
 msgstr "Énorme colline"
 
-#: ../src/editWindows.cc:317
+#: ../src/editWindows.cc:319
 msgid "small smooth"
 msgstr "Petite surface lisse"
 
-#: ../src/editWindows.cc:320
+#: ../src/editWindows.cc:322
 msgid "large smooth"
 msgstr "Grande surface lisse"
 
-#: ../src/editWindows.cc:360
+#: ../src/editWindows.cc:362
 msgid "Quit without saving?"
 msgstr "Quitter sans enregistrer ?"
 
-#: ../src/editWindows.cc:361 ../src/editWindows.cc:400
-#: ../src/editWindows.cc:447 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:177
-#: ../src/settingsMode.cc:179 ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:363 ../src/editWindows.cc:402
+#: ../src/editWindows.cc:449 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:180 ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:243
 msgid "Yes"
 msgstr "Oui"
 
-#: ../src/editWindows.cc:362 ../src/editWindows.cc:401
-#: ../src/editWindows.cc:448 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:138
-#: ../src/settingsMode.cc:177 ../src/settingsMode.cc:179
-#: ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:364 ../src/editWindows.cc:403
+#: ../src/editWindows.cc:450 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:139
+#: ../src/settingsMode.cc:178 ../src/settingsMode.cc:180
+#: ../src/settingsMode.cc:194 ../src/settingsMode.cc:243
 #, c-format
 msgid "No"
 msgstr "Non"
 
-#: ../src/editWindows.cc:399
+#: ../src/editWindows.cc:401
 msgid "Save map?"
 msgstr "Enregistrer la carte ?"
 
-#: ../src/editWindows.cc:403
+#: ../src/editWindows.cc:405
 msgid "Saving"
 msgstr "Enregistre"
 
-#: ../src/editWindows.cc:446
+#: ../src/editWindows.cc:448
 msgid "Close without saving?"
 msgstr "Quitter sans enregistrer ?"
 
-#: ../src/editWindows.cc:477
+#: ../src/editWindows.cc:479
 msgid "Name of map"
 msgstr "Nom de la carte"
 
-#: ../src/editWindows.cc:479 ../src/editWindows.cc:536
+#: ../src/editWindows.cc:481 ../src/editWindows.cc:536
 msgid "Cancel"
 msgstr "Annuler"
 
@@ -623,17 +624,17 @@ msgstr "Entrez votre nom: %s"
 msgid "John Doe"
 msgstr "Jean Dupont"
 
-#: ../src/glHelp.cc:1264
+#: ../src/glHelp.cc:1258
 #, c-format
 msgid "Framerate: %.1f"
 msgstr "Images/sec: %.1f"
 
-#: ../src/glHelp.cc:1266
+#: ../src/glHelp.cc:1260
 #, c-format
 msgid "Framerate unknown"
 msgstr "Taux d'images par seconde inconnu"
 
-#: ../src/glHelp.cc:1268
+#: ../src/glHelp.cc:1262
 #, c-format
 msgid "%.1f ms/Frame"
 msgstr "%.1f ms/Image"
@@ -819,15 +820,10 @@ msgstr "Vous amène a un autre endroit, parfois très rapidement."
 msgid "More Help"
 msgstr "Plus d'aide"
 
-#: ../src/helpMode.cc:287 ../src/hofMode.cc:107 ../src/settingsMode.cc:242
+#: ../src/helpMode.cc:287 ../src/hofMode.cc:110 ../src/settingsMode.cc:254
 msgid "Back"
 msgstr "Retour"
 
-#: ../src/highScore.cc:39
-#, c-format
-msgid "Anonymous Coward"
-msgstr "Lâche anonyme"
-
 #: ../src/hofMode.cc:89
 msgid "High Scores"
 msgstr "Scores Élevés"
@@ -836,122 +832,124 @@ msgstr "Scores Élevés"
 msgid "Level Set"
 msgstr "Groupe de niveaux"
 
-#: ../src/hofMode.cc:101
+#: ../src/hofMode.cc:100
+msgid "Anonymous Coward"
+msgstr "Lâche anonyme"
+
+#: ../src/hofMode.cc:104
 #, c-format
 msgid "%d points"
 msgstr "%d points"
 
-#: ../src/mainMode.cc:180
+#: ../src/mainMode.cc:179 ../src/setupMode.cc:227
+msgid "Unknown track"
+msgstr "Piste inconnue"
+
+#: ../src/mainMode.cc:181
 msgid "Author:"
 msgstr "Auteur:"
 
-#: ../src/mainMode.cc:182
+#: ../src/mainMode.cc:185
+msgid "Unknown author"
+msgstr "Auteur inconnu"
+
+#: ../src/mainMode.cc:187
 msgid "Press spacebar to begin"
 msgstr "Pressez espace pour commencer"
 
-#: ../src/mainMode.cc:194 ../src/mainMode.cc:203 ../src/mainMode.cc:229
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:199 ../src/mainMode.cc:208 ../src/mainMode.cc:234
+#: ../src/mainMode.cc:248
 #, c-format
 msgid "Press spacebar to continue"
 msgstr "Pressez espace pour continuer"
 
-#: ../src/mainMode.cc:195
+#: ../src/mainMode.cc:200
 msgid "Game over"
 msgstr "Perdu"
 
-#: ../src/mainMode.cc:203
+#: ../src/mainMode.cc:208
 msgid "Oops"
 msgstr "Oups"
 
-#: ../src/mainMode.cc:220
+#: ../src/mainMode.cc:225
 msgid "Paused"
 msgstr "En pause"
 
-#: ../src/mainMode.cc:229
+#: ../src/mainMode.cc:234
 msgid "Bonus level complete"
 msgstr "Niveau bonus termine"
 
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:248
 msgid "Level complete"
 msgstr "Niveau termine"
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "Congratulations"
 msgstr "Congratulations"
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "You have completed the game!"
 msgstr "Vous avez termine le jeu !"
 
-#: ../src/mainMode.cc:542 ../src/mainMode.cc:558
+#: ../src/mainMode.cc:546 ../src/mainMode.cc:561
 msgid "Good luck!"
 msgstr "Bonne chance !"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Lives"
 msgstr "Vies"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Score"
 msgstr "Points"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Time left"
 msgstr "Temps"
 
-#: ../src/mainMode.cc:653
+#: ../src/mainMode.cc:656
 #, c-format
 msgid "Level bonuses"
 msgstr "Niveaux bonus"
 
-#: ../src/mainMode.cc:655
+#: ../src/mainMode.cc:658
 #, c-format
 msgid "Lives left:"
 msgstr "Vies restantes:"
 
-#: ../src/mainMode.cc:656
+#: ../src/mainMode.cc:659
 #, c-format
 msgid "%d x 100 = %d points"
 msgstr "%d x 100 = %d points"
 
-#: ../src/mainMode.cc:657
+#: ../src/mainMode.cc:660
 #, c-format
 msgid "Time left:"
 msgstr "Temps restant:"
 
-#: ../src/mainMode.cc:658
+#: ../src/mainMode.cc:661
 #, c-format
 msgid "%d minutes = %d points"
 msgstr "%d minutes = %d points"
 
-#: ../src/mainMode.cc:660
+#: ../src/mainMode.cc:663
 #, c-format
 msgid "Difficulty:"
 msgstr "Difficulté:"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "easy"
 msgstr "facile"
 
-#: ../src/mainMode.cc:662 ../src/settingsMode.cc:199
+#: ../src/mainMode.cc:665 ../src/settingsMode.cc:204
 #, c-format
 msgid "normal"
 msgstr "normale"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "hard"
 msgstr "difficile"
 
-#: ../src/map.cc:252
-#, c-format
-msgid "Unknown track"
-msgstr "Piste inconnue"
-
-#: ../src/map.cc:253
-#, c-format
-msgid "Unknown author"
-msgstr "Auteur inconnu"
-
 #: ../src/menuMode.cc:70
 msgid ""
 "Trackballs is a game similar to the classical game Marble Madness from the "
@@ -994,322 +992,334 @@ msgstr "Aide"
 msgid "Map Editor"
 msgstr "Éditeur de cartes"
 
-#: ../src/mmad.cc:214
+#: ../src/mmad.cc:213
 msgid "Usage:"
 msgstr "Utilisation:"
 
-#: ../src/mmad.cc:215
+#: ../src/mmad.cc:214
 msgid "[-w, -m] [-e, -l -t <level>] [-r <width>] [-s <sensitivity>]"
 msgstr "[-w, -m] [-e, -l -t <niveau>] [-r <largeur>] [-s <sensibilite>]"
 
-#: ../src/mmad.cc:217
+#: ../src/mmad.cc:216
 msgid "Display this usage information."
 msgstr "Affiche ce message d'aide."
 
-#: ../src/mmad.cc:218
+#: ../src/mmad.cc:217
 msgid "Start from level."
 msgstr "Commencer à partir du niveau."
 
-#: ../src/mmad.cc:219
+#: ../src/mmad.cc:218
 msgid "Run in window (Default is fullscreen)"
 msgstr "Mode fenêtre (plein écran par défaut)"
 
-#: ../src/mmad.cc:220
+#: ../src/mmad.cc:219
 msgid "Mute sound."
 msgstr "Son muet."
 
-#: ../src/mmad.cc:221
+#: ../src/mmad.cc:220
 msgid "Set resolution to 640, 800 or 1024"
 msgstr "Définit la résolution a 640, 800 ou 1024"
 
-#: ../src/mmad.cc:222
+#: ../src/mmad.cc:221
 msgid "Mouse sensitivity, default 1.0"
 msgstr "Sensibilité de la souris, 1.0 par défaut"
 
-#: ../src/mmad.cc:223
+#: ../src/mmad.cc:222
 msgid "Displays framerate"
 msgstr "Affiche le taux d'image"
 
-#: ../src/mmad.cc:224
+#: ../src/mmad.cc:223
 msgid "Prints current version number"
 msgstr "Affiche la version courante"
 
-#: ../src/mmad.cc:225
+#: ../src/mmad.cc:224
 msgid "Updates a map to the latest format"
 msgstr "Met a jour une carte vers le format actuel"
 
-#: ../src/mmad.cc:226
+#: ../src/mmad.cc:225
 msgid "Attempt to conserve memory usage"
 msgstr "Essaie de limiter l'utilisation de mémoire"
 
-#: ../src/mmad.cc:227
+#: ../src/mmad.cc:226
 msgid "Debug joystick status"
 msgstr "Déboguer les manettes"
 
-#: ../src/mmad.cc:228
+#: ../src/mmad.cc:227
 msgid "Correct for bad joysticks"
 msgstr "Pour certaines (mauvaises) manettes de jeu"
 
-#: ../src/mmad.cc:232
+#: ../src/mmad.cc:231
 msgid "Important keyboard shortcuts"
 msgstr "Raccourcis clavier importants:"
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Escape"
 msgstr "Échap."
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Soft quit"
 msgstr "Quitter doucement"
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "CapsLock"
 msgstr "VerrMaj"
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "Unhide mouse pointer"
 msgstr "Révéler le pointeur de la souris"
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "CTRL-q"
 msgstr "CTRL-q"
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "Quit the game immediately"
 msgstr "Quitter le jeu immédiatement"
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "CTRL-f"
 msgstr "CTRL-f"
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "Toggle between fullscreen/windowed mode"
 msgstr "Basculer entre le mode plein écran / fenêtré"
 
-#: ../src/mmad.cc:237
+#: ../src/mmad.cc:236
 msgid "Kill the ball"
 msgstr "Tuer la balle"
 
-#: ../src/mmad.cc:349
+#: ../src/mmad.cc:342
 #, c-format
 msgid "Unknown screen resolution of width %d"
 msgstr "Résolution d'écran inconnue de largeur %d"
 
-#: ../src/mmad.cc:382
+#: ../src/mmad.cc:375
 msgid "Welcome to Trackballs."
 msgstr "Bienvenue dans Trackballs."
 
-#: ../src/mmad.cc:384
+#: ../src/mmad.cc:377
 #, c-format
 msgid "Using %s as gamedata directory."
 msgstr "Utilise %s comme répertoire de données."
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Speed ball"
 msgstr "Vitesse"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Extra jump"
 msgstr "Saut supplémentaire"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Spikes"
 msgstr "Piquante"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Glass ball"
 msgstr "Balle de verre"
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Dizzy!"
 msgstr "Pris de vertige!"
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Freeze!"
 msgstr "Glacé!"
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Floating"
 msgstr "Flottant"
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Extra life"
 msgstr "Vie supplémentaire"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Small ball"
 msgstr "Petite balle"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Large ball"
 msgstr "Grande balle"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Nitro"
 msgstr "Nitro"
 
-#: ../src/settingsMode.cc:84
+#: ../src/settingsMode.cc:85
 msgid "Game Settings"
 msgstr "Paramètres de jeu"
 
-#: ../src/settingsMode.cc:94
+#: ../src/settingsMode.cc:95
 #, c-format
 msgid "Is resolution %dx%dx%d ok?"
 msgstr "La résolution %dx%dx%d est-elle acceptable?"
 
-#: ../src/settingsMode.cc:97
+#: ../src/settingsMode.cc:98
 #, c-format
 msgid "Is resolution Auto-%d ok?"
 msgstr "La résolution Auto-%d est-elle acceptable?"
 
-#: ../src/settingsMode.cc:101
+#: ../src/settingsMode.cc:102
 msgid "Ok, use this resolution"
 msgstr "Oui, utilisez cette résolution"
 
-#: ../src/settingsMode.cc:102
+#: ../src/settingsMode.cc:103
 msgid "No, revert to old resolution"
 msgstr "Non, revenir à l'ancienne résolution"
 
-#: ../src/settingsMode.cc:104
+#: ../src/settingsMode.cc:105
 #, c-format
 msgid "Timeout in %d seconds"
 msgstr "Délai d'attente en %d secondes"
 
-#: ../src/settingsMode.cc:116
+#: ../src/settingsMode.cc:117
 msgid "Video"
 msgstr "Vidéo"
 
-#: ../src/settingsMode.cc:123
+#: ../src/settingsMode.cc:124
 #, c-format
 msgid "Auto-%d"
 msgstr "Auto-%d"
 
-#: ../src/settingsMode.cc:125
+#: ../src/settingsMode.cc:126
 msgid "Resolution"
 msgstr "Résolution"
 
-#: ../src/settingsMode.cc:126
+#: ../src/settingsMode.cc:127
 msgid "Test this resolution"
 msgstr "Testez cette résolution"
 
-#: ../src/settingsMode.cc:129
+#: ../src/settingsMode.cc:130
 msgid "Fullscreen"
 msgstr "Plein écran"
 
-#: ../src/settingsMode.cc:132
+#: ../src/settingsMode.cc:133
 msgid "VSync"
 msgstr "VSYNC"
 
-#: ../src/settingsMode.cc:141
+#: ../src/settingsMode.cc:142
 #, c-format
 msgid "Frame rate"
 msgstr "Taux d'images"
 
-#: ../src/settingsMode.cc:144
+#: ../src/settingsMode.cc:145
 #, c-format
 msgid "Frame time"
 msgstr "Temps d'image"
 
-#: ../src/settingsMode.cc:147
+#: ../src/settingsMode.cc:148
 msgid "Show FPS"
 msgstr "Montrer les IPS"
 
-#: ../src/settingsMode.cc:152
+#: ../src/settingsMode.cc:153
 msgid "Graphics"
 msgstr "Graphismes"
 
-#: ../src/settingsMode.cc:157
+#: ../src/settingsMode.cc:158
 #, c-format
 msgid "None"
 msgstr "Aucun"
 
-#: ../src/settingsMode.cc:160
+#: ../src/settingsMode.cc:161
 #, c-format
 msgid "Minimalistic"
 msgstr "Minimalistes"
 
-#: ../src/settingsMode.cc:163
+#: ../src/settingsMode.cc:164
 #, c-format
 msgid "Simple"
 msgstr "Simples"
 
-#: ../src/settingsMode.cc:166
+#: ../src/settingsMode.cc:167
 #, c-format
 msgid "Standard"
 msgstr "Standard"
 
-#: ../src/settingsMode.cc:169
+#: ../src/settingsMode.cc:170
 #, c-format
 msgid "Extra"
 msgstr "Extra"
 
-#: ../src/settingsMode.cc:172
+#: ../src/settingsMode.cc:173
 #, c-format
 msgid "Everything"
 msgstr "Tout"
 
-#: ../src/settingsMode.cc:175
+#: ../src/settingsMode.cc:176
 msgid "Details"
 msgstr "Détails"
 
-#: ../src/settingsMode.cc:176
+#: ../src/settingsMode.cc:177
 msgid "Reflections"
 msgstr "Réflexions"
 
-#: ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:179
 msgid "Shadows"
 msgstr "Ombres"
 
-#: ../src/settingsMode.cc:185
+#: ../src/settingsMode.cc:183
+msgid "Shadow Resolution"
+msgstr "Résolution des ombres"
+
+#: ../src/settingsMode.cc:190
 msgid "Controls"
 msgstr "Contrôles"
 
-#: ../src/settingsMode.cc:188
+#: ../src/settingsMode.cc:193
 msgid "Use mouse"
 msgstr "Utiliser la souris"
 
-#: ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:199
 msgid "Sensitivity"
 msgstr "Sensibilité"
 
-#: ../src/settingsMode.cc:201
+#: ../src/settingsMode.cc:206
 #, c-format
 msgid "+%d degrees"
 msgstr "+%d degrés"
 
-#: ../src/settingsMode.cc:203
+#: ../src/settingsMode.cc:208
 #, c-format
 msgid "-%d degrees"
 msgstr "-%d degrés"
 
-#: ../src/settingsMode.cc:204
+#: ../src/settingsMode.cc:209
 msgid "Steering"
 msgstr "Direction"
 
-#: ../src/settingsMode.cc:211
+#: ../src/settingsMode.cc:216
 #, c-format
 msgid "no joystick found"
 msgstr "Aucun joystick n'a été trouvé"
 
-#: ../src/settingsMode.cc:215
+#: ../src/settingsMode.cc:220
 msgid "Joystick:"
 msgstr "Manette de jeu:"
 
-#: ../src/settingsMode.cc:225
+#: ../src/settingsMode.cc:230
 msgid "Other"
 msgstr "Autre"
 
-#: ../src/settingsMode.cc:229
+#: ../src/settingsMode.cc:233
+msgid "Language"
+msgstr "Langage"
+
+#: ../src/settingsMode.cc:237
 msgid "Music volume"
 msgstr "Volume de la musique"
 
-#: ../src/settingsMode.cc:231
+#: ../src/settingsMode.cc:239
 msgid "Effects volume"
 msgstr "Volume des effets"
 
-#: ../src/settingsMode.cc:233
-msgid "Language"
-msgstr "Langage"
+#: ../src/settingsMode.cc:242
+msgid "Sandbox mode available"
+msgstr "Mode de contrôle disponible"
+
+#: ../src/settingsMode.cc:246
+msgid "Time Compression"
+msgstr "Compression du temps"
 
 #: ../src/setupMode.cc:203
 msgid "Setup new game"
@@ -1327,55 +1337,55 @@ msgstr "ND"
 msgid "Level"
 msgstr "Niveau"
 
-#: ../src/setupMode.cc:228
+#: ../src/setupMode.cc:231
 msgid "Difficulty"
 msgstr "Difficulté"
 
-#: ../src/setupMode.cc:232
+#: ../src/setupMode.cc:235
 msgid "Sandbox (Easy)"
 msgstr "Contrôle (Facile)"
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Normal)"
 msgstr "Contrôle (Normale)"
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Hard)"
 msgstr "Contrôle (Difficile)"
 
-#: ../src/setupMode.cc:235
+#: ../src/setupMode.cc:238
 msgid "Easy"
 msgstr "Facile"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Normal"
 msgstr "Normale"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Hard"
 msgstr "Difficile"
 
-#: ../src/setupMode.cc:241
+#: ../src/setupMode.cc:244
 #, c-format
 msgid "Total games played: %d"
 msgstr "Nombre de partie jouées : %d"
 
-#: ../src/setupMode.cc:245
+#: ../src/setupMode.cc:248
 #, c-format
 msgid "Average score: %d"
 msgstr "Score moyen : %d"
 
-#: ../src/setupMode.cc:247
+#: ../src/setupMode.cc:250
 #, c-format
 msgid "Average score: N/A"
 msgstr "Score moyen : N/A"
 
-#: ../src/setupMode.cc:250
+#: ../src/setupMode.cc:253
 #, c-format
 msgid "Levels completed: %d"
 msgstr "Niveaux terminés : %d"
 
-#: ../src/setupMode.cc:262
+#: ../src/setupMode.cc:269
 msgid "Start Game"
 msgstr "Commencer une partie"
 
@@ -1483,6 +1493,18 @@ msgstr "Un ensemble étrange de niveaux avec un nom étrange -"
 msgid "All made by Francek."
 msgstr "Tous faits par Francek."
 
+#: ../share/levels/ds.set:1
+msgid "Don't stop"
+msgstr "À ne pas arrêter"
+
+#: ../share/levels/ds.set:3 ../share/levels/ds1.scm:3
+msgid "Principia"
+msgstr "Principia"
+
+#: ../share/levels/ds.set:4
+msgid "Or stay still and see what happens!"
+msgstr "Ou restez immobile et voyez ce qui se passe!"
+
 #: ../share/levels/elite.set:1
 msgid "Elite"
 msgstr "Élite"
@@ -1686,15 +1708,15 @@ msgstr "Saut, 200pt"
 msgid "Four Doors"
 msgstr "Quatre portes"
 
-#: ../share/levels/bx2.scm:293
+#: ../share/levels/bx2.scm:304
 msgid "4 hidden switches open exit doors."
 msgstr "4 interrupteurs cachés ouvrent les portes de sortie."
 
-#: ../share/levels/bx2.scm:295
+#: ../share/levels/bx2.scm:306
 msgid "A switch is nearby."
 msgstr "Un interrupteur est à proximité."
 
-#: ../share/levels/bx2.scm:297
+#: ../share/levels/bx2.scm:308
 msgid "Peace."
 msgstr "Paix."
 
@@ -1702,35 +1724,35 @@ msgstr "Paix."
 msgid "Azteca"
 msgstr "Aztèques"
 
-#: ../share/levels/bx3.scm:107
+#: ../share/levels/bx3.scm:111
 msgid "You have access to the complex."
 msgstr "Vous avez accès au complexe."
 
-#: ../share/levels/bx3.scm:125
+#: ../share/levels/bx3.scm:129
 msgid "The way is opened across the sand."
 msgstr "La voie est ouverte sur le sable."
 
-#: ../share/levels/bx3.scm:135
+#: ../share/levels/bx3.scm:139
 msgid "You must enter the Arena."
 msgstr "Vous devez entrer dans l'Arène."
 
-#: ../share/levels/bx3.scm:195 ../share/levels/bx3.scm:202
+#: ../share/levels/bx3.scm:199 ../share/levels/bx3.scm:206
 msgid "A wall has been lowered."
 msgstr "Un mur a été abaissé."
 
-#: ../share/levels/bx3.scm:209
+#: ../share/levels/bx3.scm:213
 msgid "A roof has been raised."
 msgstr "Un toit a été élevé."
 
-#: ../share/levels/bx3.scm:225
+#: ../share/levels/bx3.scm:229
 msgid "Stairs are in place."
 msgstr "Les escaliers sont en place."
 
-#: ../share/levels/bx3.scm:235
+#: ../share/levels/bx3.scm:239
 msgid "You may enter upper complex."
 msgstr "Vous pouvez entrer dans le complexe supérieur."
 
-#: ../share/levels/bx3.scm:249
+#: ../share/levels/bx3.scm:252
 msgid "The exit is now open."
 msgstr "La sortie est ouverte."
 
@@ -1839,6 +1861,18 @@ msgstr "Mouillez!"
 msgid "Final and the last"
 msgstr "Finale et dernière"
 
+#: ../share/levels/dn6.scm:37 ../share/levels/dn6.scm:73
+msgid "Switch twice"
+msgstr "Changer deux fois"
+
+#: ../share/levels/ds2.scm:3
+msgid "Orbit"
+msgstr "Orbite"
+
+#: ../share/levels/ds3.scm:3
+msgid "Tunnel"
+msgstr "Tunnel"
+
 #: ../share/levels/elite1.scm:3
 msgid "Castle of Darius the Mede"
 msgstr "Château de Darius le Mede"
@@ -1983,7 +2017,7 @@ msgstr "Grabuge"
 msgid "The Castle"
 msgstr "Le château"
 
-#: ../share/levels/mhm3.scm:24
+#: ../share/levels/mhm3.scm:15
 msgid "Stay on the path or else!"
 msgstr "Restez sur le chemin!"
 
@@ -2055,15 +2089,15 @@ msgstr "Oxygène"
 msgid "The Marble HQ"
 msgstr "Le QG de marbre"
 
-#: ../share/levels/sl6.scm:203
+#: ../share/levels/sl6.scm:199
 msgid "The Marble HQ - Do not Enter!"
 msgstr "Le QG de marbe -- Ne pas entrer!"
 
-#: ../share/levels/sl6.scm:344
+#: ../share/levels/sl6.scm:340
 msgid "Bonus"
 msgstr "Bonus"
 
-#: ../share/levels/sl6.scm:526
+#: ../share/levels/sl6.scm:521
 msgid "Commander's Hall"
 msgstr "Salle du commandant"
 
diff --git a/po/hu.po b/po/hu.po
index ddfd995..3dc022b 100644
--- a/po/hu.po
+++ b/po/hu.po
@@ -9,7 +9,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 1.2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-14 23:50-0400\n"
+"POT-Creation-Date: 2018-03-10 17:16-0500\n"
 "PO-Revision-Date: 2017-06-25 20:05-0400\n"
 "Last-Translator: Attila Boros <wraith13 at gmail dot com>\n"
 "Language-Team: Hungarian\n"
@@ -67,383 +67,383 @@ msgid "Save point"
 msgstr "%d pont"
 
 #. TRANSLATORS: This is a list of all the menus in the map editor.
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "File"
 msgstr "Fájl"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Edit"
 msgstr "Szerkesztés"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Color"
 msgstr "Szín"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Flags"
 msgstr "Kapcsolók"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Feature"
 msgstr "Tulajdonság"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Repair"
 msgstr ""
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Move"
 msgstr "Mozgatás"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Window"
 msgstr "Ablak"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "View"
 msgstr "Nézet"
 
 #. TRANSLATORS: This is a list of all the submenus in the map
 #. editor, if the initial character is * or / then that character
 #. must be perserved as it is.
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "New"
 msgstr "Új"
 
-#: ../src/editMode.cc:176 ../src/editWindows.cc:480
+#: ../src/editMode.cc:178 ../src/editWindows.cc:482
 msgid "Open"
 msgstr "Megnyitás"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Close"
 msgstr "Bezárás"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Save"
 msgstr "Mentés"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Exit"
 msgstr "Kilépés"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Test level"
 msgstr "Pálya tesztelése"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit height"
 msgstr "Magasság szerkesztése"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit color"
 msgstr "Szín szerkesztése"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit water"
 msgstr "Víz szerkesztése"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit velocity"
 msgstr "Sebesség szerkesztése"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit lines"
 msgstr "Vonalak szerkesztése"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "*<SPACE> Whole cell"
 msgstr "*<SPACE> Egész cella"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Upper corner"
 msgstr "Felső sarok"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Bottom corner"
 msgstr "Alsó sarok"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Right corner"
 msgstr "Jobb sarok"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Left corner"
 msgstr "Bal sarok"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Center"
 msgstr "Közép"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Raise increment"
 msgstr "Lépésköz növelése"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Lower increment"
 msgstr "Lépésköz csökkentése"
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<SHIFT> reversed"
 msgstr "*<SHIFT> fordított"
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<CTRL> walls"
 msgstr "*<CTRL> falak"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. red"
 msgstr "vörös növ."
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. green"
 msgstr "zöld növ."
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. blue"
 msgstr "kék növ."
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. alpha"
 msgstr "átlátszóság növ."
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Ice"
 msgstr "Jég"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198 ../share/levels/lv2.scm:4
+#: ../src/editMode.cc:184 ../src/editMode.cc:200 ../share/levels/lv2.scm:4
 msgid "Acid"
 msgstr "Sav"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Sand"
 msgstr "Homok"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "Kill"
 msgstr "Halál"
 
-#: ../src/editMode.cc:182
+#: ../src/editMode.cc:184
 msgid "Bounce"
 msgstr "Pattogás"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "No grid"
 msgstr "Nincs rács"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:200
+#: ../src/editMode.cc:184 ../src/editMode.cc:202
 msgid "Track"
 msgstr "Pálya"
 
-#: ../src/editMode.cc:183 ../src/editMode.cc:200
+#: ../src/editMode.cc:185 ../src/editMode.cc:202
 msgid "Shade flat"
 msgstr ""
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "Texture"
 msgstr "Textúra"
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "ch. texture"
 msgstr "Textúra váltás"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Spike"
 msgstr "Tüske"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Small hill"
 msgstr "Kis domb"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Medium hill"
 msgstr "Közepes domb"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Large hill"
 msgstr "Nagy domb"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Huge hill"
 msgstr "Óriási domb"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth small"
 msgstr "Kis simítás"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth large"
 msgstr "Nagy simítás"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Cell cont."
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Water cont."
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 #, fuzzy
 msgid "Color cont."
 msgstr "Szín"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 #, fuzzy
 msgid "Cell center"
 msgstr "Közép"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Water center"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 #, fuzzy
 msgid "Color center"
 msgstr "Közép"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Cell round"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 #, fuzzy
 msgid "Water round"
 msgstr "Hang elnémítása."
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 #, fuzzy
 msgid "Color round"
 msgstr "Szín"
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 msgid "Vel. round"
 msgstr ""
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/UP Move up"
 msgstr "/UP Mozgás fel"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/DOWN Move down"
 msgstr "/DOWN Mozgás le"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/LEFT Move left"
 msgstr "/LEFT Mozgás balra"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/RIGHT Move right"
 msgstr "/RIGHT Mozgás jobbra"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map up"
 msgstr "térkép fel"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map down"
 msgstr "térkép le"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map left"
 msgstr "térkép balra"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map right"
 msgstr "térkép jobbra"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "*<SHIFT> x5"
 msgstr "*<SHIFT> x5"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Set region marker"
 msgstr "Terület kijelölése"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Clear marker"
 msgstr "Kijelölés törlése"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Copy region"
 msgstr "Terület másolása"
 
-#: ../src/editMode.cc:192
+#: ../src/editMode.cc:194
 msgid "Paste region"
 msgstr "Terület beszúrása"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Editor"
 msgstr "Szerkesztő"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Toolbar"
 msgstr "Eszközsor"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Status"
 msgstr "Állapot"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Birds's eye"
 msgstr "Madártávlat"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Rotate view"
 msgstr "Nézet forgatása"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Load entities"
 msgstr ""
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Clear entities"
 msgstr ""
 
-#: ../src/editMode.cc:199
+#: ../src/editMode.cc:201
 msgid "Trampoline"
 msgstr "Trambulin"
 
-#: ../src/editMode.cc:204
+#: ../src/editMode.cc:206
 msgid "Small smooth"
 msgstr "Kis simítás"
 
-#: ../src/editMode.cc:205
+#: ../src/editMode.cc:207
 msgid "Large smooth"
 msgstr "Nagy simítás"
 
-#: ../src/editMode.cc:341 ../src/mainMode.cc:178
+#: ../src/editMode.cc:343 ../src/mainMode.cc:175
 msgid "Track:"
 msgstr "Pálya:"
 
-#: ../src/editMode.cc:342
+#: ../src/editMode.cc:344
 msgid "This is the default script file for this track."
 msgstr "Ez az alapértelmezett script fájl ehhez a pályához."
 
-#: ../src/editMode.cc:344
+#: ../src/editMode.cc:346
 msgid "Read the documentation for the editor and look at the examples"
 msgstr "Olvasd el a pályaszerkesztő dokumentációját és nézd meg a példákat,"
 
-#: ../src/editMode.cc:345
+#: ../src/editMode.cc:347
 msgid "to learn how to customize it"
 msgstr "hogy megtanuld, hogyan kell testre szabni."
 
-#: ../src/editMode.cc:348
+#: ../src/editMode.cc:350
 msgid "Enter your name here"
 msgstr ""
 
-#: ../src/editMode.cc:352
+#: ../src/editMode.cc:354
 msgid "Add the name of the next level here"
 msgstr "A következő pályára juttat."
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell height"
 msgstr "Cella magassága"
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell water height"
 msgstr "Cella vízszintje"
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Textures"
 msgstr "Textúrák"
 
@@ -543,79 +543,80 @@ msgstr ""
 msgid "Lines"
 msgstr ""
 
-#: ../src/editWindows.cc:302
+#: ../src/editWindows.cc:304
 #, fuzzy
 msgid "spike"
 msgstr "Tüske"
 
-#: ../src/editWindows.cc:305
+#: ../src/editWindows.cc:307
 #, fuzzy
 msgid "small hill"
 msgstr "Kis domb"
 
-#: ../src/editWindows.cc:308
+#: ../src/editWindows.cc:310
 #, fuzzy
 msgid "medium hill"
 msgstr "Közepes domb"
 
-#: ../src/editWindows.cc:311
+#: ../src/editWindows.cc:313
 #, fuzzy
 msgid "large hill"
 msgstr "Nagy domb"
 
-#: ../src/editWindows.cc:314
+#: ../src/editWindows.cc:316
 #, fuzzy
 msgid "huge hill"
 msgstr "Óriási domb"
 
-#: ../src/editWindows.cc:317
+#: ../src/editWindows.cc:319
 #, fuzzy
 msgid "small smooth"
 msgstr "Kis simítás"
 
-#: ../src/editWindows.cc:320
+#: ../src/editWindows.cc:322
 #, fuzzy
 msgid "large smooth"
 msgstr "Nagy simítás"
 
-#: ../src/editWindows.cc:360
+#: ../src/editWindows.cc:362
 msgid "Quit without saving?"
 msgstr "Kilépés mentés nélkül?"
 
-#: ../src/editWindows.cc:361 ../src/editWindows.cc:400
-#: ../src/editWindows.cc:447 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:177
-#: ../src/settingsMode.cc:179 ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:363 ../src/editWindows.cc:402
+#: ../src/editWindows.cc:449 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:180 ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:243
 msgid "Yes"
 msgstr "Igen"
 
-#: ../src/editWindows.cc:362 ../src/editWindows.cc:401
-#: ../src/editWindows.cc:448 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:138
-#: ../src/settingsMode.cc:177 ../src/settingsMode.cc:179
-#: ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:364 ../src/editWindows.cc:403
+#: ../src/editWindows.cc:450 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:139
+#: ../src/settingsMode.cc:178 ../src/settingsMode.cc:180
+#: ../src/settingsMode.cc:194 ../src/settingsMode.cc:243
 #, c-format
 msgid "No"
 msgstr "Nem"
 
-#: ../src/editWindows.cc:399
+#: ../src/editWindows.cc:401
 msgid "Save map?"
 msgstr "Pálya mentése?"
 
-#: ../src/editWindows.cc:403
+#: ../src/editWindows.cc:405
 msgid "Saving"
 msgstr "Mentés"
 
-#: ../src/editWindows.cc:446
+#: ../src/editWindows.cc:448
 #, fuzzy
 msgid "Close without saving?"
 msgstr "Kilépés mentés nélkül?"
 
-#: ../src/editWindows.cc:477
+#: ../src/editWindows.cc:479
 msgid "Name of map"
 msgstr "Pálya neve"
 
-#: ../src/editWindows.cc:479 ../src/editWindows.cc:536
+#: ../src/editWindows.cc:481 ../src/editWindows.cc:536
 msgid "Cancel"
 msgstr "Mégse"
 
@@ -646,17 +647,17 @@ msgstr ""
 msgid "John Doe"
 msgstr ""
 
-#: ../src/glHelp.cc:1264
+#: ../src/glHelp.cc:1258
 #, c-format
 msgid "Framerate: %.1f"
 msgstr "Képfrissítés: %.1f"
 
-#: ../src/glHelp.cc:1266
+#: ../src/glHelp.cc:1260
 #, c-format
 msgid "Framerate unknown"
 msgstr "Ismeretlen képfrissítés"
 
-#: ../src/glHelp.cc:1268
+#: ../src/glHelp.cc:1262
 #, c-format
 msgid "%.1f ms/Frame"
 msgstr ""
@@ -843,15 +844,10 @@ msgstr "Más helyre juttat, időnként nagy sebességgel."
 msgid "More Help"
 msgstr "További segítség"
 
-#: ../src/helpMode.cc:287 ../src/hofMode.cc:107 ../src/settingsMode.cc:242
+#: ../src/helpMode.cc:287 ../src/hofMode.cc:110 ../src/settingsMode.cc:254
 msgid "Back"
 msgstr "Vissza"
 
-#: ../src/highScore.cc:39
-#, c-format
-msgid "Anonymous Coward"
-msgstr ""
-
 #: ../src/hofMode.cc:89
 msgid "High Scores"
 msgstr ""
@@ -860,124 +856,126 @@ msgstr ""
 msgid "Level Set"
 msgstr "Pályacsoport"
 
-#: ../src/hofMode.cc:101
+#: ../src/hofMode.cc:100
+msgid "Anonymous Coward"
+msgstr ""
+
+#: ../src/hofMode.cc:104
 #, c-format
 msgid "%d points"
 msgstr "%d pont"
 
-#: ../src/mainMode.cc:180
+#: ../src/mainMode.cc:179 ../src/setupMode.cc:227
+msgid "Unknown track"
+msgstr "Ismeretlen pálya"
+
+#: ../src/mainMode.cc:181
 msgid "Author:"
 msgstr "Szerző:"
 
-#: ../src/mainMode.cc:182
+#: ../src/mainMode.cc:185
+msgid "Unknown author"
+msgstr "Ismeretlen szerző"
+
+#: ../src/mainMode.cc:187
 msgid "Press spacebar to begin"
 msgstr "Kezdés a szóköz megnyomásával"
 
-#: ../src/mainMode.cc:194 ../src/mainMode.cc:203 ../src/mainMode.cc:229
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:199 ../src/mainMode.cc:208 ../src/mainMode.cc:234
+#: ../src/mainMode.cc:248
 #, c-format
 msgid "Press spacebar to continue"
 msgstr "Folytatás a szóköz megnyomásával"
 
-#: ../src/mainMode.cc:195
+#: ../src/mainMode.cc:200
 msgid "Game over"
 msgstr "Vége a játéknak"
 
-#: ../src/mainMode.cc:203
+#: ../src/mainMode.cc:208
 msgid "Oops"
 msgstr "Hopp!"
 
-#: ../src/mainMode.cc:220
+#: ../src/mainMode.cc:225
 msgid "Paused"
 msgstr "Pillanatstop"
 
-#: ../src/mainMode.cc:229
+#: ../src/mainMode.cc:234
 msgid "Bonus level complete"
 msgstr "Jutalompálya teljesítve"
 
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:248
 msgid "Level complete"
 msgstr "Pálya teljesítve"
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "Congratulations"
 msgstr "Gratulálok"
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "You have completed the game!"
 msgstr "Teljesítetted a játékot"
 
-#: ../src/mainMode.cc:542 ../src/mainMode.cc:558
+#: ../src/mainMode.cc:546 ../src/mainMode.cc:561
 msgid "Good luck!"
 msgstr "Sok szerencsét!"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 #, fuzzy
 msgid "Lives"
 msgstr "Megmaradt életek:"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Score"
 msgstr ""
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 #, fuzzy
 msgid "Time left"
 msgstr "Hátralévő idő:"
 
-#: ../src/mainMode.cc:653
+#: ../src/mainMode.cc:656
 #, c-format
 msgid "Level bonuses"
 msgstr "Pálya bónuszok"
 
-#: ../src/mainMode.cc:655
+#: ../src/mainMode.cc:658
 #, c-format
 msgid "Lives left:"
 msgstr "Megmaradt életek:"
 
-#: ../src/mainMode.cc:656
+#: ../src/mainMode.cc:659
 #, c-format
 msgid "%d x 100 = %d points"
 msgstr "%d x 100 = %d pont"
 
-#: ../src/mainMode.cc:657
+#: ../src/mainMode.cc:660
 #, c-format
 msgid "Time left:"
 msgstr "Hátralévő idő:"
 
-#: ../src/mainMode.cc:658
+#: ../src/mainMode.cc:661
 #, c-format
 msgid "%d minutes = %d points"
 msgstr "%d perc = %d pont"
 
-#: ../src/mainMode.cc:660
+#: ../src/mainMode.cc:663
 #, c-format
 msgid "Difficulty:"
 msgstr "Nehézségi szint:"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "easy"
 msgstr "könnyű"
 
-#: ../src/mainMode.cc:662 ../src/settingsMode.cc:199
+#: ../src/mainMode.cc:665 ../src/settingsMode.cc:204
 #, c-format
 msgid "normal"
 msgstr "normál"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "hard"
 msgstr "nehéz"
 
-#: ../src/map.cc:252
-#, c-format
-msgid "Unknown track"
-msgstr "Ismeretlen pálya"
-
-#: ../src/map.cc:253
-#, c-format
-msgid "Unknown author"
-msgstr "Ismeretlen szerző"
-
 #: ../src/menuMode.cc:70
 msgid ""
 "Trackballs is a game similar to the classical game Marble Madness from the "
@@ -1019,327 +1017,340 @@ msgstr "Súgó"
 msgid "Map Editor"
 msgstr "Pályaszerkesztő"
 
-#: ../src/mmad.cc:214
+#: ../src/mmad.cc:213
 msgid "Usage:"
 msgstr "Használat:"
 
-#: ../src/mmad.cc:215
+#: ../src/mmad.cc:214
 msgid "[-w, -m] [-e, -l -t <level>] [-r <width>] [-s <sensitivity>]"
 msgstr "[-w, -m] [-e, -l -t <pálya>] [-r <szélesség>] [-s <érzékenység>]"
 
-#: ../src/mmad.cc:217
+#: ../src/mmad.cc:216
 msgid "Display this usage information."
 msgstr "Megjeleníti ezt a használati útmutatót."
 
-#: ../src/mmad.cc:218
+#: ../src/mmad.cc:217
 msgid "Start from level."
 msgstr "Indítás pályától."
 
-#: ../src/mmad.cc:219
+#: ../src/mmad.cc:218
 msgid "Run in window (Default is fullscreen)"
 msgstr "Ablakban futtatás (teljes képernyős az alapértelmezett)"
 
-#: ../src/mmad.cc:220
+#: ../src/mmad.cc:219
 msgid "Mute sound."
 msgstr "Hang elnémítása."
 
-#: ../src/mmad.cc:221
+#: ../src/mmad.cc:220
 msgid "Set resolution to 640, 800 or 1024"
 msgstr "Felbontás beállítása 640, 800 vagy 1024 értékre."
 
-#: ../src/mmad.cc:222
+#: ../src/mmad.cc:221
 msgid "Mouse sensitivity, default 1.0"
 msgstr "Egér érzékenység, 1.0 az alapértelmezett."
 
-#: ../src/mmad.cc:223
+#: ../src/mmad.cc:222
 msgid "Displays framerate"
 msgstr ""
 
-#: ../src/mmad.cc:224
+#: ../src/mmad.cc:223
 msgid "Prints current version number"
 msgstr "Aktuális verziószám kiírása."
 
-#: ../src/mmad.cc:225
+#: ../src/mmad.cc:224
 msgid "Updates a map to the latest format"
 msgstr "Aktualizálja a pályát a legutóbbi formátumra."
 
-#: ../src/mmad.cc:226
+#: ../src/mmad.cc:225
 msgid "Attempt to conserve memory usage"
 msgstr "Kevesebb memóriát használ."
 
-#: ../src/mmad.cc:227
+#: ../src/mmad.cc:226
 msgid "Debug joystick status"
 msgstr ""
 
-#: ../src/mmad.cc:228
+#: ../src/mmad.cc:227
 msgid "Correct for bad joysticks"
 msgstr "Hibás botkormány javítása."
 
-#: ../src/mmad.cc:232
+#: ../src/mmad.cc:231
 msgid "Important keyboard shortcuts"
 msgstr "Fontos gyorsbillentyűk"
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Escape"
 msgstr "Escape"
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Soft quit"
 msgstr "Kilépés"
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "CapsLock"
 msgstr "Caps Lock"
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "Unhide mouse pointer"
 msgstr "Egérmutató megjelenítése"
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "CTRL-q"
 msgstr "CTRL-q"
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "Quit the game immediately"
 msgstr "Azonnali kilépés"
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "CTRL-f"
 msgstr "CTRL-f"
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "Toggle between fullscreen/windowed mode"
 msgstr "Váltás teljes képernyős/ablakos mód között"
 
-#: ../src/mmad.cc:237
+#: ../src/mmad.cc:236
 msgid "Kill the ball"
 msgstr "Játék feladása"
 
-#: ../src/mmad.cc:349
+#: ../src/mmad.cc:342
 #, c-format
 msgid "Unknown screen resolution of width %d"
 msgstr "Ismeretlen képernyőfelbontás %d szélességgel"
 
-#: ../src/mmad.cc:382
+#: ../src/mmad.cc:375
 msgid "Welcome to Trackballs."
 msgstr "Üdvözöllek a Trackballs játékban. "
 
-#: ../src/mmad.cc:384
+#: ../src/mmad.cc:377
 #, c-format
 msgid "Using %s as gamedata directory."
 msgstr "%s használata adatkönyvtárnak."
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Speed ball"
 msgstr ""
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 #, fuzzy
 msgid "Extra jump"
 msgstr "Extra"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 #, fuzzy
 msgid "Spikes"
 msgstr "Tüske"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Glass ball"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Dizzy!"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Freeze!"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Floating"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 #, fuzzy
 msgid "Extra life"
 msgstr "Extra"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 #, fuzzy
 msgid "Small ball"
 msgstr "Kis domb"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 #, fuzzy
 msgid "Large ball"
 msgstr "Nagy domb"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Nitro"
 msgstr ""
 
-#: ../src/settingsMode.cc:84
+#: ../src/settingsMode.cc:85
 msgid "Game Settings"
 msgstr "Játék beállítások"
 
-#: ../src/settingsMode.cc:94
+#: ../src/settingsMode.cc:95
 #, c-format
 msgid "Is resolution %dx%dx%d ok?"
 msgstr "Rendben van a %dx%dx%d képernyőfelbontás?"
 
-#: ../src/settingsMode.cc:97
+#: ../src/settingsMode.cc:98
 #, fuzzy, c-format
 msgid "Is resolution Auto-%d ok?"
 msgstr "Rendben van a %dx%dx%d képernyőfelbontás?"
 
-#: ../src/settingsMode.cc:101
+#: ../src/settingsMode.cc:102
 msgid "Ok, use this resolution"
 msgstr "Rendben, használd ezt a felbontást"
 
-#: ../src/settingsMode.cc:102
+#: ../src/settingsMode.cc:103
 msgid "No, revert to old resolution"
 msgstr "Nem, visszatérés az előző felbontáshoz"
 
-#: ../src/settingsMode.cc:104
+#: ../src/settingsMode.cc:105
 #, c-format
 msgid "Timeout in %d seconds"
 msgstr "Lejár az idő %d másodperc múlva"
 
-#: ../src/settingsMode.cc:116
+#: ../src/settingsMode.cc:117
 msgid "Video"
 msgstr ""
 
-#: ../src/settingsMode.cc:123
+#: ../src/settingsMode.cc:124
 #, c-format
 msgid "Auto-%d"
 msgstr ""
 
-#: ../src/settingsMode.cc:125
+#: ../src/settingsMode.cc:126
 msgid "Resolution"
 msgstr "Felbontás"
 
-#: ../src/settingsMode.cc:126
+#: ../src/settingsMode.cc:127
 msgid "Test this resolution"
 msgstr "Ennek a felbontásnak a tesztelése"
 
-#: ../src/settingsMode.cc:129
+#: ../src/settingsMode.cc:130
 msgid "Fullscreen"
 msgstr "Teljes képernyő"
 
-#: ../src/settingsMode.cc:132
+#: ../src/settingsMode.cc:133
 msgid "VSync"
 msgstr ""
 
-#: ../src/settingsMode.cc:141
+#: ../src/settingsMode.cc:142
 #, c-format
 msgid "Frame rate"
 msgstr "Képfrissítés"
 
-#: ../src/settingsMode.cc:144
+#: ../src/settingsMode.cc:145
 #, c-format
 msgid "Frame time"
 msgstr ""
 
-#: ../src/settingsMode.cc:147
+#: ../src/settingsMode.cc:148
 msgid "Show FPS"
 msgstr "FPS mutatása"
 
-#: ../src/settingsMode.cc:152
+#: ../src/settingsMode.cc:153
 msgid "Graphics"
 msgstr "Grafika"
 
-#: ../src/settingsMode.cc:157
+#: ../src/settingsMode.cc:158
 #, c-format
 msgid "None"
 msgstr "Nincs"
 
-#: ../src/settingsMode.cc:160
+#: ../src/settingsMode.cc:161
 #, c-format
 msgid "Minimalistic"
 msgstr "Minimális"
 
-#: ../src/settingsMode.cc:163
+#: ../src/settingsMode.cc:164
 #, c-format
 msgid "Simple"
 msgstr "Egyszerű"
 
-#: ../src/settingsMode.cc:166
+#: ../src/settingsMode.cc:167
 #, c-format
 msgid "Standard"
 msgstr "Általános"
 
-#: ../src/settingsMode.cc:169
+#: ../src/settingsMode.cc:170
 #, c-format
 msgid "Extra"
 msgstr "Extra"
 
-#: ../src/settingsMode.cc:172
+#: ../src/settingsMode.cc:173
 #, c-format
 msgid "Everything"
 msgstr "Minden"
 
-#: ../src/settingsMode.cc:175
+#: ../src/settingsMode.cc:176
 msgid "Details"
 msgstr "Részletek"
 
-#: ../src/settingsMode.cc:176
+#: ../src/settingsMode.cc:177
 msgid "Reflections"
 msgstr "Tükröződés (beta)"
 
-#: ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:179
 msgid "Shadows"
 msgstr ""
 
-#: ../src/settingsMode.cc:185
+#: ../src/settingsMode.cc:183
+#, fuzzy
+msgid "Shadow Resolution"
+msgstr "Felbontás"
+
+#: ../src/settingsMode.cc:190
 msgid "Controls"
 msgstr "Irányítás"
 
-#: ../src/settingsMode.cc:188
+#: ../src/settingsMode.cc:193
 msgid "Use mouse"
 msgstr "Egér használata"
 
-#: ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:199
 msgid "Sensitivity"
 msgstr "Érzékenység"
 
-#: ../src/settingsMode.cc:201
+#: ../src/settingsMode.cc:206
 #, c-format
 msgid "+%d degrees"
 msgstr "+%d fok"
 
-#: ../src/settingsMode.cc:203
+#: ../src/settingsMode.cc:208
 #, c-format
 msgid "-%d degrees"
 msgstr "-%d fok"
 
-#: ../src/settingsMode.cc:204
+#: ../src/settingsMode.cc:209
 msgid "Steering"
 msgstr "Kormányzás"
 
-#: ../src/settingsMode.cc:211
+#: ../src/settingsMode.cc:216
 #, c-format
 msgid "no joystick found"
 msgstr "Nem található botkormány"
 
-#: ../src/settingsMode.cc:215
+#: ../src/settingsMode.cc:220
 msgid "Joystick:"
 msgstr "Botkormány:"
 
-#: ../src/settingsMode.cc:225
+#: ../src/settingsMode.cc:230
 msgid "Other"
 msgstr "Egyebek"
 
-#: ../src/settingsMode.cc:229
+#: ../src/settingsMode.cc:233
+msgid "Language"
+msgstr "Nyelv"
+
+#: ../src/settingsMode.cc:237
 msgid "Music volume"
 msgstr "Zene hangereje"
 
-#: ../src/settingsMode.cc:231
+#: ../src/settingsMode.cc:239
 msgid "Effects volume"
 msgstr "Effektek hangereje"
 
-#: ../src/settingsMode.cc:233
-msgid "Language"
-msgstr "Nyelv"
+#: ../src/settingsMode.cc:242
+msgid "Sandbox mode available"
+msgstr ""
+
+#: ../src/settingsMode.cc:246
+msgid "Time Compression"
+msgstr ""
 
 #: ../src/setupMode.cc:203
 msgid "Setup new game"
@@ -1357,55 +1368,55 @@ msgstr "Nincs"
 msgid "Level"
 msgstr "Pálya"
 
-#: ../src/setupMode.cc:228
+#: ../src/setupMode.cc:231
 msgid "Difficulty"
 msgstr "Nehézség"
 
-#: ../src/setupMode.cc:232
+#: ../src/setupMode.cc:235
 msgid "Sandbox (Easy)"
 msgstr "Homokozó (Könnyű)"
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Normal)"
 msgstr "Homokozó (Normál)"
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Hard)"
 msgstr "Homokozó (Nehéz)"
 
-#: ../src/setupMode.cc:235
+#: ../src/setupMode.cc:238
 msgid "Easy"
 msgstr "Könnyű"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Normal"
 msgstr "Normál"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Hard"
 msgstr "Nehéz"
 
-#: ../src/setupMode.cc:241
+#: ../src/setupMode.cc:244
 #, c-format
 msgid "Total games played: %d"
 msgstr "Összes eddigi játék: %d"
 
-#: ../src/setupMode.cc:245
+#: ../src/setupMode.cc:248
 #, c-format
 msgid "Average score: %d"
 msgstr "Átlagos pontszám: %d"
 
-#: ../src/setupMode.cc:247
+#: ../src/setupMode.cc:250
 #, c-format
 msgid "Average score: N/A"
 msgstr "Átlagos pontszám: nincs"
 
-#: ../src/setupMode.cc:250
+#: ../src/setupMode.cc:253
 #, c-format
 msgid "Levels completed: %d"
 msgstr "Teljesített pályák: %d"
 
-#: ../src/setupMode.cc:262
+#: ../src/setupMode.cc:269
 msgid "Start Game"
 msgstr "Játék indítása"
 
@@ -1509,6 +1520,18 @@ msgstr ""
 msgid "All made by Francek."
 msgstr ""
 
+#: ../share/levels/ds.set:1
+msgid "Don't stop"
+msgstr ""
+
+#: ../share/levels/ds.set:3 ../share/levels/ds1.scm:3
+msgid "Principia"
+msgstr ""
+
+#: ../share/levels/ds.set:4
+msgid "Or stay still and see what happens!"
+msgstr ""
+
 #: ../share/levels/elite.set:1
 msgid "Elite"
 msgstr ""
@@ -1714,15 +1737,15 @@ msgstr ""
 msgid "Four Doors"
 msgstr ""
 
-#: ../share/levels/bx2.scm:293
+#: ../share/levels/bx2.scm:304
 msgid "4 hidden switches open exit doors."
 msgstr ""
 
-#: ../share/levels/bx2.scm:295
+#: ../share/levels/bx2.scm:306
 msgid "A switch is nearby."
 msgstr ""
 
-#: ../share/levels/bx2.scm:297
+#: ../share/levels/bx2.scm:308
 msgid "Peace."
 msgstr ""
 
@@ -1730,36 +1753,36 @@ msgstr ""
 msgid "Azteca"
 msgstr ""
 
-#: ../share/levels/bx3.scm:107
+#: ../share/levels/bx3.scm:111
 #, fuzzy
 msgid "You have access to the complex."
 msgstr "Teljesítetted a játékot"
 
-#: ../share/levels/bx3.scm:125
+#: ../share/levels/bx3.scm:129
 msgid "The way is opened across the sand."
 msgstr ""
 
-#: ../share/levels/bx3.scm:135
+#: ../share/levels/bx3.scm:139
 msgid "You must enter the Arena."
 msgstr ""
 
-#: ../share/levels/bx3.scm:195 ../share/levels/bx3.scm:202
+#: ../share/levels/bx3.scm:199 ../share/levels/bx3.scm:206
 msgid "A wall has been lowered."
 msgstr ""
 
-#: ../share/levels/bx3.scm:209
+#: ../share/levels/bx3.scm:213
 msgid "A roof has been raised."
 msgstr ""
 
-#: ../share/levels/bx3.scm:225
+#: ../share/levels/bx3.scm:229
 msgid "Stairs are in place."
 msgstr ""
 
-#: ../share/levels/bx3.scm:235
+#: ../share/levels/bx3.scm:239
 msgid "You may enter upper complex."
 msgstr ""
 
-#: ../share/levels/bx3.scm:249
+#: ../share/levels/bx3.scm:252
 msgid "The exit is now open."
 msgstr ""
 
@@ -1869,6 +1892,20 @@ msgstr ""
 msgid "Final and the last"
 msgstr ""
 
+#: ../share/levels/dn6.scm:37 ../share/levels/dn6.scm:73
+#, fuzzy
+msgid "Switch twice"
+msgstr "Kapcsoló:"
+
+#: ../share/levels/ds2.scm:3
+msgid "Orbit"
+msgstr ""
+
+#: ../share/levels/ds3.scm:3
+#, fuzzy
+msgid "Tunnel"
+msgstr "Cső:"
+
 #: ../share/levels/elite1.scm:3
 msgid "Castle of Darius the Mede"
 msgstr ""
@@ -2014,7 +2051,7 @@ msgstr ""
 msgid "The Castle"
 msgstr ""
 
-#: ../share/levels/mhm3.scm:24
+#: ../share/levels/mhm3.scm:15
 msgid "Stay on the path or else!"
 msgstr ""
 
@@ -2088,15 +2125,15 @@ msgstr ""
 msgid "The Marble HQ"
 msgstr ""
 
-#: ../share/levels/sl6.scm:203
+#: ../share/levels/sl6.scm:199
 msgid "The Marble HQ - Do not Enter!"
 msgstr ""
 
-#: ../share/levels/sl6.scm:344
+#: ../share/levels/sl6.scm:340
 msgid "Bonus"
 msgstr ""
 
-#: ../share/levels/sl6.scm:526
+#: ../share/levels/sl6.scm:521
 msgid "Commander's Hall"
 msgstr ""
 
diff --git a/po/it.po b/po/it.po
index c094caf..fdc3454 100644
--- a/po/it.po
+++ b/po/it.po
@@ -7,7 +7,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: 1.1\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-14 23:50-0400\n"
+"POT-Creation-Date: 2018-03-10 17:16-0500\n"
 "PO-Revision-Date: 2017-06-25 20:22-0400\n"
 "Last-Translator: Francesco (ThN1saHead) Guatieri <nisacorp at ncsinfo.it>\n"
 "Language-Team: francesco\n"
@@ -65,384 +65,384 @@ msgid "Save point"
 msgstr "%d punti"
 
 #. TRANSLATORS: This is a list of all the menus in the map editor.
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "File"
 msgstr "File"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Edit"
 msgstr "Modifica"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Color"
 msgstr "Colore"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Flags"
 msgstr "Parametri"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Feature"
 msgstr "Caratteristiche"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Repair"
 msgstr ""
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Move"
 msgstr "Sposta"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Window"
 msgstr "Finestra"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "View"
 msgstr "Visualizza"
 
 #. TRANSLATORS: This is a list of all the submenus in the map
 #. editor, if the initial character is * or / then that character
 #. must be perserved as it is.
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "New"
 msgstr "Nuovo"
 
-#: ../src/editMode.cc:176 ../src/editWindows.cc:480
+#: ../src/editMode.cc:178 ../src/editWindows.cc:482
 msgid "Open"
 msgstr "Apri"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Close"
 msgstr "Chiudi"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Save"
 msgstr "Salva"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Exit"
 msgstr "Esci"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Test level"
 msgstr "Prova livello"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit height"
 msgstr "Modifica altezza"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit color"
 msgstr "Modifica colore"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit water"
 msgstr "Modifica acqua"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit velocity"
 msgstr "Modifica velocità"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit lines"
 msgstr "Modifica linee."
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "*<SPACE> Whole cell"
 msgstr "*<SPACE> Intera cella"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Upper corner"
 msgstr "Angolo superiore"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Bottom corner"
 msgstr "Angolo inferiore"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Right corner"
 msgstr "Angolo destro"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Left corner"
 msgstr "Angolo sinistro"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Center"
 msgstr "Centro"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Raise increment"
 msgstr "Aumenta l'incremento"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Lower increment"
 msgstr "Diminuisci l'incremento"
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<SHIFT> reversed"
 msgstr "*<MAIUSC> invertito"
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<CTRL> walls"
 msgstr "*<CTRL> pareti"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. red"
 msgstr "Aumenta il Rosso"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. green"
 msgstr "Aumenta il Verde"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. blue"
 msgstr "Aumenta il Blu"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. alpha"
 msgstr "Aumenta la trasparenza"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Ice"
 msgstr "Ghiaccio"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198 ../share/levels/lv2.scm:4
+#: ../src/editMode.cc:184 ../src/editMode.cc:200 ../share/levels/lv2.scm:4
 msgid "Acid"
 msgstr "Acido"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Sand"
 msgstr "Sabbia"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "Kill"
 msgstr "Assassino"
 
-#: ../src/editMode.cc:182
+#: ../src/editMode.cc:184
 msgid "Bounce"
 msgstr "Rimbalzo"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "No grid"
 msgstr "Nascondi griglia"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:200
+#: ../src/editMode.cc:184 ../src/editMode.cc:202
 msgid "Track"
 msgstr "Traccia"
 
-#: ../src/editMode.cc:183 ../src/editMode.cc:200
+#: ../src/editMode.cc:185 ../src/editMode.cc:202
 msgid "Shade flat"
 msgstr ""
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "Texture"
 msgstr "Texture"
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "ch. texture"
 msgstr "Cambia texture"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Spike"
 msgstr "Aculeo"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Small hill"
 msgstr "Collina piccola"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Medium hill"
 msgstr "Collina media"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Large hill"
 msgstr "Collina grande"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Huge hill"
 msgstr "Collina enorme"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth small"
 msgstr "Arrotonda poco"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth large"
 msgstr "Arrotonda molto"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Cell cont."
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Water cont."
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 #, fuzzy
 msgid "Color cont."
 msgstr "Colore"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 #, fuzzy
 msgid "Cell center"
 msgstr "Centro"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Water center"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 #, fuzzy
 msgid "Color center"
 msgstr "Centro"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Cell round"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 #, fuzzy
 msgid "Water round"
 msgstr "Senza audio."
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 #, fuzzy
 msgid "Color round"
 msgstr "Colore"
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 msgid "Vel. round"
 msgstr ""
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/UP Move up"
 msgstr "/UP Sposta su"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/DOWN Move down"
 msgstr "/DOWN Sposta giù"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/LEFT Move left"
 msgstr "/LEFT Sposta a sinistra"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/RIGHT Move right"
 msgstr "/RIGHT Spostra a destra"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map up"
 msgstr "Sposta in su la mappa"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map down"
 msgstr "Sposta in giù la mappa"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map left"
 msgstr "Sposta la mappa a sinistra"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map right"
 msgstr "Sposta la mappa a destra"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "*<SHIFT> x5"
 msgstr "*<MAIUSC> x5"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Set region marker"
 msgstr "Imposta marcatore di regione"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Clear marker"
 msgstr "Elimina marcatore"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Copy region"
 msgstr "Copia area"
 
-#: ../src/editMode.cc:192
+#: ../src/editMode.cc:194
 msgid "Paste region"
 msgstr "Incolla area"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Editor"
 msgstr "Editor"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Toolbar"
 msgstr "Barra degli strumenti"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Status"
 msgstr "Stato"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Birds's eye"
 msgstr "Panoramica"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Rotate view"
 msgstr "Ruota visuale"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Load entities"
 msgstr ""
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Clear entities"
 msgstr ""
 
-#: ../src/editMode.cc:199
+#: ../src/editMode.cc:201
 msgid "Trampoline"
 msgstr "Trampolino"
 
-#: ../src/editMode.cc:204
+#: ../src/editMode.cc:206
 msgid "Small smooth"
 msgstr "Arrotonda poco"
 
-#: ../src/editMode.cc:205
+#: ../src/editMode.cc:207
 msgid "Large smooth"
 msgstr "Arrotonda molto"
 
-#: ../src/editMode.cc:341 ../src/mainMode.cc:178
+#: ../src/editMode.cc:343 ../src/mainMode.cc:175
 msgid "Track:"
 msgstr "Traccia:"
 
-#: ../src/editMode.cc:342
+#: ../src/editMode.cc:344
 msgid "This is the default script file for this track."
 msgstr "Questo è lo script predefinito per questo percorso."
 
-#: ../src/editMode.cc:344
+#: ../src/editMode.cc:346
 msgid "Read the documentation for the editor and look at the examples"
 msgstr "Leggere la documentazione dell' Editor di livelli"
 
-#: ../src/editMode.cc:345
+#: ../src/editMode.cc:347
 msgid "to learn how to customize it"
 msgstr "per imparare come personalizzarlo"
 
-#: ../src/editMode.cc:348
+#: ../src/editMode.cc:350
 msgid "Enter your name here"
 msgstr ""
 
-#: ../src/editMode.cc:352
+#: ../src/editMode.cc:354
 #, fuzzy
 msgid "Add the name of the next level here"
 msgstr "Ti condurrà al livello successivo."
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell height"
 msgstr "Altezza cella"
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell water height"
 msgstr "Altezza acqua nella cella."
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Textures"
 msgstr "Textures"
 
@@ -542,79 +542,80 @@ msgstr ""
 msgid "Lines"
 msgstr ""
 
-#: ../src/editWindows.cc:302
+#: ../src/editWindows.cc:304
 #, fuzzy
 msgid "spike"
 msgstr "Aculeo"
 
-#: ../src/editWindows.cc:305
+#: ../src/editWindows.cc:307
 #, fuzzy
 msgid "small hill"
 msgstr "Collina piccola"
 
-#: ../src/editWindows.cc:308
+#: ../src/editWindows.cc:310
 #, fuzzy
 msgid "medium hill"
 msgstr "Collina media"
 
-#: ../src/editWindows.cc:311
+#: ../src/editWindows.cc:313
 #, fuzzy
 msgid "large hill"
 msgstr "Collina grande"
 
-#: ../src/editWindows.cc:314
+#: ../src/editWindows.cc:316
 #, fuzzy
 msgid "huge hill"
 msgstr "Collina enorme"
 
-#: ../src/editWindows.cc:317
+#: ../src/editWindows.cc:319
 #, fuzzy
 msgid "small smooth"
 msgstr "Arrotonda poco"
 
-#: ../src/editWindows.cc:320
+#: ../src/editWindows.cc:322
 #, fuzzy
 msgid "large smooth"
 msgstr "Arrotonda molto"
 
-#: ../src/editWindows.cc:360
+#: ../src/editWindows.cc:362
 msgid "Quit without saving?"
 msgstr "Si desidera uscire senza salvare?"
 
-#: ../src/editWindows.cc:361 ../src/editWindows.cc:400
-#: ../src/editWindows.cc:447 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:177
-#: ../src/settingsMode.cc:179 ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:363 ../src/editWindows.cc:402
+#: ../src/editWindows.cc:449 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:180 ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:243
 msgid "Yes"
 msgstr "Sì"
 
-#: ../src/editWindows.cc:362 ../src/editWindows.cc:401
-#: ../src/editWindows.cc:448 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:138
-#: ../src/settingsMode.cc:177 ../src/settingsMode.cc:179
-#: ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:364 ../src/editWindows.cc:403
+#: ../src/editWindows.cc:450 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:139
+#: ../src/settingsMode.cc:178 ../src/settingsMode.cc:180
+#: ../src/settingsMode.cc:194 ../src/settingsMode.cc:243
 #, c-format
 msgid "No"
 msgstr "No"
 
-#: ../src/editWindows.cc:399
+#: ../src/editWindows.cc:401
 msgid "Save map?"
 msgstr "Salvare la mappa?"
 
-#: ../src/editWindows.cc:403
+#: ../src/editWindows.cc:405
 msgid "Saving"
 msgstr "Salvataggio"
 
-#: ../src/editWindows.cc:446
+#: ../src/editWindows.cc:448
 #, fuzzy
 msgid "Close without saving?"
 msgstr "Si desidera uscire senza salvare?"
 
-#: ../src/editWindows.cc:477
+#: ../src/editWindows.cc:479
 msgid "Name of map"
 msgstr "Nome della mappa"
 
-#: ../src/editWindows.cc:479 ../src/editWindows.cc:536
+#: ../src/editWindows.cc:481 ../src/editWindows.cc:536
 msgid "Cancel"
 msgstr "Annulla"
 
@@ -645,17 +646,17 @@ msgstr ""
 msgid "John Doe"
 msgstr ""
 
-#: ../src/glHelp.cc:1264
+#: ../src/glHelp.cc:1258
 #, c-format
 msgid "Framerate: %.1f"
 msgstr "Fotogrammi al secondo: %.1f"
 
-#: ../src/glHelp.cc:1266
+#: ../src/glHelp.cc:1260
 #, c-format
 msgid "Framerate unknown"
 msgstr "Fotogrammi al secondo: sconosciuti"
 
-#: ../src/glHelp.cc:1268
+#: ../src/glHelp.cc:1262
 #, c-format
 msgid "%.1f ms/Frame"
 msgstr ""
@@ -845,15 +846,10 @@ msgstr "Ti porta in un altro luogo, a volte a gran velocità."
 msgid "More Help"
 msgstr "Avanti"
 
-#: ../src/helpMode.cc:287 ../src/hofMode.cc:107 ../src/settingsMode.cc:242
+#: ../src/helpMode.cc:287 ../src/hofMode.cc:110 ../src/settingsMode.cc:254
 msgid "Back"
 msgstr "Indietro"
 
-#: ../src/highScore.cc:39
-#, c-format
-msgid "Anonymous Coward"
-msgstr ""
-
 #: ../src/hofMode.cc:89
 msgid "High Scores"
 msgstr ""
@@ -862,124 +858,126 @@ msgstr ""
 msgid "Level Set"
 msgstr "Livelloteca:"
 
-#: ../src/hofMode.cc:101
+#: ../src/hofMode.cc:100
+msgid "Anonymous Coward"
+msgstr ""
+
+#: ../src/hofMode.cc:104
 #, c-format
 msgid "%d points"
 msgstr "%d punti"
 
-#: ../src/mainMode.cc:180
+#: ../src/mainMode.cc:179 ../src/setupMode.cc:227
+msgid "Unknown track"
+msgstr ""
+
+#: ../src/mainMode.cc:181
 msgid "Author:"
 msgstr "Autore:"
 
-#: ../src/mainMode.cc:182
+#: ../src/mainMode.cc:185
+msgid "Unknown author"
+msgstr ""
+
+#: ../src/mainMode.cc:187
 msgid "Press spacebar to begin"
 msgstr "Premere spazio per iniziare"
 
-#: ../src/mainMode.cc:194 ../src/mainMode.cc:203 ../src/mainMode.cc:229
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:199 ../src/mainMode.cc:208 ../src/mainMode.cc:234
+#: ../src/mainMode.cc:248
 #, c-format
 msgid "Press spacebar to continue"
 msgstr "Premere spazio per continuare."
 
-#: ../src/mainMode.cc:195
+#: ../src/mainMode.cc:200
 msgid "Game over"
 msgstr "Game over"
 
-#: ../src/mainMode.cc:203
+#: ../src/mainMode.cc:208
 msgid "Oops"
 msgstr "Oops"
 
-#: ../src/mainMode.cc:220
+#: ../src/mainMode.cc:225
 msgid "Paused"
 msgstr "Pausa"
 
-#: ../src/mainMode.cc:229
+#: ../src/mainMode.cc:234
 msgid "Bonus level complete"
 msgstr "Livello bonus completato"
 
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:248
 msgid "Level complete"
 msgstr "Livello completato"
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "Congratulations"
 msgstr "Complimenti,"
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "You have completed the game!"
 msgstr "Hai terminato il gioco!"
 
-#: ../src/mainMode.cc:542 ../src/mainMode.cc:558
+#: ../src/mainMode.cc:546 ../src/mainMode.cc:561
 msgid "Good luck!"
 msgstr "Buona fortuna!"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 #, fuzzy
 msgid "Lives"
 msgstr "Vite rimaste:"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Score"
 msgstr ""
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 #, fuzzy
 msgid "Time left"
 msgstr "Tempo rimanente:"
 
-#: ../src/mainMode.cc:653
+#: ../src/mainMode.cc:656
 #, c-format
 msgid "Level bonuses"
 msgstr "Bonus del livello"
 
-#: ../src/mainMode.cc:655
+#: ../src/mainMode.cc:658
 #, c-format
 msgid "Lives left:"
 msgstr "Vite rimaste:"
 
-#: ../src/mainMode.cc:656
+#: ../src/mainMode.cc:659
 #, c-format
 msgid "%d x 100 = %d points"
 msgstr "%d x 100 = %d punti"
 
-#: ../src/mainMode.cc:657
+#: ../src/mainMode.cc:660
 #, c-format
 msgid "Time left:"
 msgstr "Tempo rimanente:"
 
-#: ../src/mainMode.cc:658
+#: ../src/mainMode.cc:661
 #, c-format
 msgid "%d minutes = %d points"
 msgstr "%d minuti = %d punti"
 
-#: ../src/mainMode.cc:660
+#: ../src/mainMode.cc:663
 #, c-format
 msgid "Difficulty:"
 msgstr "Difficoltà:"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "easy"
 msgstr "facile"
 
-#: ../src/mainMode.cc:662 ../src/settingsMode.cc:199
+#: ../src/mainMode.cc:665 ../src/settingsMode.cc:204
 #, c-format
 msgid "normal"
 msgstr "normale"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "hard"
 msgstr "difficile"
 
-#: ../src/map.cc:252
-#, c-format
-msgid "Unknown track"
-msgstr ""
-
-#: ../src/map.cc:253
-#, c-format
-msgid "Unknown author"
-msgstr ""
-
 #: ../src/menuMode.cc:70
 msgid ""
 "Trackballs is a game similar to the classical game Marble Madness from the "
@@ -1023,328 +1021,341 @@ msgstr "Guida"
 msgid "Map Editor"
 msgstr "Editor di livelli"
 
-#: ../src/mmad.cc:214
+#: ../src/mmad.cc:213
 msgid "Usage:"
 msgstr "Utilizzo:"
 
-#: ../src/mmad.cc:215
+#: ../src/mmad.cc:214
 msgid "[-w, -m] [-e, -l -t <level>] [-r <width>] [-s <sensitivity>]"
 msgstr "[-w, -m] [-e, -l -t <livello>] [-r <larghezza>] [-s <sensibilità>]"
 
-#: ../src/mmad.cc:217
+#: ../src/mmad.cc:216
 msgid "Display this usage information."
 msgstr "Visualizza questa guida."
 
-#: ../src/mmad.cc:218
+#: ../src/mmad.cc:217
 msgid "Start from level."
 msgstr "Parte dal livello."
 
-#: ../src/mmad.cc:219
+#: ../src/mmad.cc:218
 msgid "Run in window (Default is fullscreen)"
 msgstr "Avvia in una finestra (predefinito tuttoschermo)"
 
-#: ../src/mmad.cc:220
+#: ../src/mmad.cc:219
 msgid "Mute sound."
 msgstr "Senza audio."
 
-#: ../src/mmad.cc:221
+#: ../src/mmad.cc:220
 msgid "Set resolution to 640, 800 or 1024"
 msgstr "Imposta la risoluzione a 640, 800 o 1024"
 
-#: ../src/mmad.cc:222
+#: ../src/mmad.cc:221
 msgid "Mouse sensitivity, default 1.0"
 msgstr "Sensibilità del mouse, predefinita 1.0"
 
-#: ../src/mmad.cc:223
+#: ../src/mmad.cc:222
 msgid "Displays framerate"
 msgstr "Visualizza i fotogrammi al secondo"
 
-#: ../src/mmad.cc:224
+#: ../src/mmad.cc:223
 msgid "Prints current version number"
 msgstr "Visualizza la versione corrente"
 
-#: ../src/mmad.cc:225
+#: ../src/mmad.cc:224
 msgid "Updates a map to the latest format"
 msgstr "Aggiorna una mappa all'ultimo FileFormat"
 
-#: ../src/mmad.cc:226
+#: ../src/mmad.cc:225
 msgid "Attempt to conserve memory usage"
 msgstr "Ottimizza l'utilizzo della memoria"
 
-#: ../src/mmad.cc:227
+#: ../src/mmad.cc:226
 #, fuzzy
 msgid "Debug joystick status"
 msgstr "Muovi joystick verso l'alto"
 
-#: ../src/mmad.cc:228
+#: ../src/mmad.cc:227
 msgid "Correct for bad joysticks"
 msgstr "Correzione per joystick difettosi"
 
-#: ../src/mmad.cc:232
+#: ../src/mmad.cc:231
 msgid "Important keyboard shortcuts"
 msgstr ""
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Escape"
 msgstr ""
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Soft quit"
 msgstr ""
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "CapsLock"
 msgstr ""
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "Unhide mouse pointer"
 msgstr ""
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "CTRL-q"
 msgstr ""
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "Quit the game immediately"
 msgstr ""
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "CTRL-f"
 msgstr ""
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "Toggle between fullscreen/windowed mode"
 msgstr ""
 
-#: ../src/mmad.cc:237
+#: ../src/mmad.cc:236
 msgid "Kill the ball"
 msgstr ""
 
-#: ../src/mmad.cc:349
+#: ../src/mmad.cc:342
 #, c-format
 msgid "Unknown screen resolution of width %d"
 msgstr "Risoluzione schermo sconosciuta per larghezza %d"
 
-#: ../src/mmad.cc:382
+#: ../src/mmad.cc:375
 msgid "Welcome to Trackballs."
 msgstr "Benvenuti in Trackballs."
 
-#: ../src/mmad.cc:384
+#: ../src/mmad.cc:377
 #, c-format
 msgid "Using %s as gamedata directory."
 msgstr "Utilizza la catella %s per i dati del gioco."
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Speed ball"
 msgstr ""
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 #, fuzzy
 msgid "Extra jump"
 msgstr "Molti"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 #, fuzzy
 msgid "Spikes"
 msgstr "Aculeo"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Glass ball"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Dizzy!"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Freeze!"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Floating"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 #, fuzzy
 msgid "Extra life"
 msgstr "Molti"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 #, fuzzy
 msgid "Small ball"
 msgstr "Collina piccola"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 #, fuzzy
 msgid "Large ball"
 msgstr "Collina grande"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Nitro"
 msgstr ""
 
-#: ../src/settingsMode.cc:84
+#: ../src/settingsMode.cc:85
 msgid "Game Settings"
 msgstr "Impostazioni"
 
-#: ../src/settingsMode.cc:94
+#: ../src/settingsMode.cc:95
 #, c-format
 msgid "Is resolution %dx%dx%d ok?"
 msgstr ""
 
-#: ../src/settingsMode.cc:97
+#: ../src/settingsMode.cc:98
 #, c-format
 msgid "Is resolution Auto-%d ok?"
 msgstr ""
 
-#: ../src/settingsMode.cc:101
+#: ../src/settingsMode.cc:102
 #, fuzzy
 msgid "Ok, use this resolution"
 msgstr "Risoluzione"
 
-#: ../src/settingsMode.cc:102
+#: ../src/settingsMode.cc:103
 msgid "No, revert to old resolution"
 msgstr ""
 
-#: ../src/settingsMode.cc:104
+#: ../src/settingsMode.cc:105
 #, c-format
 msgid "Timeout in %d seconds"
 msgstr ""
 
-#: ../src/settingsMode.cc:116
+#: ../src/settingsMode.cc:117
 msgid "Video"
 msgstr ""
 
-#: ../src/settingsMode.cc:123
+#: ../src/settingsMode.cc:124
 #, c-format
 msgid "Auto-%d"
 msgstr ""
 
-#: ../src/settingsMode.cc:125
+#: ../src/settingsMode.cc:126
 msgid "Resolution"
 msgstr "Risoluzione"
 
-#: ../src/settingsMode.cc:126
+#: ../src/settingsMode.cc:127
 msgid "Test this resolution"
 msgstr "Risoluzione"
 
-#: ../src/settingsMode.cc:129
+#: ../src/settingsMode.cc:130
 msgid "Fullscreen"
 msgstr "Schermo intero"
 
-#: ../src/settingsMode.cc:132
+#: ../src/settingsMode.cc:133
 msgid "VSync"
 msgstr ""
 
-#: ../src/settingsMode.cc:141
+#: ../src/settingsMode.cc:142
 #, fuzzy, c-format
 msgid "Frame rate"
 msgstr "Fotogrammi al secondo: %.1f"
 
-#: ../src/settingsMode.cc:144
+#: ../src/settingsMode.cc:145
 #, c-format
 msgid "Frame time"
 msgstr ""
 
-#: ../src/settingsMode.cc:147
+#: ../src/settingsMode.cc:148
 msgid "Show FPS"
 msgstr "Visualizza FPS"
 
-#: ../src/settingsMode.cc:152
+#: ../src/settingsMode.cc:153
 msgid "Graphics"
 msgstr "Grafica"
 
-#: ../src/settingsMode.cc:157
+#: ../src/settingsMode.cc:158
 #, c-format
 msgid "None"
 msgstr "Nessuno"
 
-#: ../src/settingsMode.cc:160
+#: ../src/settingsMode.cc:161
 #, c-format
 msgid "Minimalistic"
 msgstr "Minimi"
 
-#: ../src/settingsMode.cc:163
+#: ../src/settingsMode.cc:164
 #, c-format
 msgid "Simple"
 msgstr "Pochi"
 
-#: ../src/settingsMode.cc:166
+#: ../src/settingsMode.cc:167
 #, c-format
 msgid "Standard"
 msgstr "Standard"
 
-#: ../src/settingsMode.cc:169
+#: ../src/settingsMode.cc:170
 #, c-format
 msgid "Extra"
 msgstr "Molti"
 
-#: ../src/settingsMode.cc:172
+#: ../src/settingsMode.cc:173
 #, c-format
 msgid "Everything"
 msgstr "Tutti"
 
-#: ../src/settingsMode.cc:175
+#: ../src/settingsMode.cc:176
 msgid "Details"
 msgstr "Dettagli"
 
-#: ../src/settingsMode.cc:176
+#: ../src/settingsMode.cc:177
 msgid "Reflections"
 msgstr "Riflessi (beta)"
 
-#: ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:179
 msgid "Shadows"
 msgstr ""
 
-#: ../src/settingsMode.cc:185
+#: ../src/settingsMode.cc:183
+#, fuzzy
+msgid "Shadow Resolution"
+msgstr "Risoluzione"
+
+#: ../src/settingsMode.cc:190
 msgid "Controls"
 msgstr "Controlli"
 
-#: ../src/settingsMode.cc:188
+#: ../src/settingsMode.cc:193
 msgid "Use mouse"
 msgstr "Utilizza mouse"
 
-#: ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:199
 msgid "Sensitivity"
 msgstr "Sensibilità"
 
-#: ../src/settingsMode.cc:201
+#: ../src/settingsMode.cc:206
 #, c-format
 msgid "+%d degrees"
 msgstr "+%d gradi"
 
-#: ../src/settingsMode.cc:203
+#: ../src/settingsMode.cc:208
 #, c-format
 msgid "-%d degrees"
 msgstr "-%d gradi"
 
-#: ../src/settingsMode.cc:204
+#: ../src/settingsMode.cc:209
 msgid "Steering"
 msgstr "Direzione"
 
-#: ../src/settingsMode.cc:211
+#: ../src/settingsMode.cc:216
 #, fuzzy, c-format
 msgid "no joystick found"
 msgstr "Muovi joystick in basso"
 
-#: ../src/settingsMode.cc:215
+#: ../src/settingsMode.cc:220
 msgid "Joystick:"
 msgstr "Joystick:"
 
-#: ../src/settingsMode.cc:225
+#: ../src/settingsMode.cc:230
 msgid "Other"
 msgstr "Altro"
 
-#: ../src/settingsMode.cc:229
+#: ../src/settingsMode.cc:233
+msgid "Language"
+msgstr ""
+
+#: ../src/settingsMode.cc:237
 msgid "Music volume"
 msgstr "Volume musica"
 
-#: ../src/settingsMode.cc:231
+#: ../src/settingsMode.cc:239
 msgid "Effects volume"
 msgstr "Volume effetti"
 
-#: ../src/settingsMode.cc:233
-msgid "Language"
+#: ../src/settingsMode.cc:242
+msgid "Sandbox mode available"
+msgstr ""
+
+#: ../src/settingsMode.cc:246
+msgid "Time Compression"
 msgstr ""
 
 #: ../src/setupMode.cc:203
@@ -1363,55 +1374,55 @@ msgstr "N/D"
 msgid "Level"
 msgstr "Livello"
 
-#: ../src/setupMode.cc:228
+#: ../src/setupMode.cc:231
 msgid "Difficulty"
 msgstr "Difficoltà:"
 
-#: ../src/setupMode.cc:232
+#: ../src/setupMode.cc:235
 msgid "Sandbox (Easy)"
 msgstr ""
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Normal)"
 msgstr ""
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Hard)"
 msgstr ""
 
-#: ../src/setupMode.cc:235
+#: ../src/setupMode.cc:238
 msgid "Easy"
 msgstr "Facile"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Normal"
 msgstr "Normale"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Hard"
 msgstr "Difficile"
 
-#: ../src/setupMode.cc:241
+#: ../src/setupMode.cc:244
 #, c-format
 msgid "Total games played: %d"
 msgstr "Partite giocate: %d"
 
-#: ../src/setupMode.cc:245
+#: ../src/setupMode.cc:248
 #, c-format
 msgid "Average score: %d"
 msgstr "Punteggio medio: %d"
 
-#: ../src/setupMode.cc:247
+#: ../src/setupMode.cc:250
 #, c-format
 msgid "Average score: N/A"
 msgstr "Punteggio medio: N/D"
 
-#: ../src/setupMode.cc:250
+#: ../src/setupMode.cc:253
 #, c-format
 msgid "Levels completed: %d"
 msgstr "Livelli completati: %d"
 
-#: ../src/setupMode.cc:262
+#: ../src/setupMode.cc:269
 msgid "Start Game"
 msgstr "Gioca!"
 
@@ -1515,6 +1526,18 @@ msgstr ""
 msgid "All made by Francek."
 msgstr ""
 
+#: ../share/levels/ds.set:1
+msgid "Don't stop"
+msgstr ""
+
+#: ../share/levels/ds.set:3 ../share/levels/ds1.scm:3
+msgid "Principia"
+msgstr ""
+
+#: ../share/levels/ds.set:4
+msgid "Or stay still and see what happens!"
+msgstr ""
+
 #: ../share/levels/elite.set:1
 msgid "Elite"
 msgstr ""
@@ -1720,15 +1743,15 @@ msgstr ""
 msgid "Four Doors"
 msgstr ""
 
-#: ../share/levels/bx2.scm:293
+#: ../share/levels/bx2.scm:304
 msgid "4 hidden switches open exit doors."
 msgstr ""
 
-#: ../share/levels/bx2.scm:295
+#: ../share/levels/bx2.scm:306
 msgid "A switch is nearby."
 msgstr ""
 
-#: ../share/levels/bx2.scm:297
+#: ../share/levels/bx2.scm:308
 msgid "Peace."
 msgstr ""
 
@@ -1736,36 +1759,36 @@ msgstr ""
 msgid "Azteca"
 msgstr ""
 
-#: ../share/levels/bx3.scm:107
+#: ../share/levels/bx3.scm:111
 #, fuzzy
 msgid "You have access to the complex."
 msgstr "Hai terminato il gioco!"
 
-#: ../share/levels/bx3.scm:125
+#: ../share/levels/bx3.scm:129
 msgid "The way is opened across the sand."
 msgstr ""
 
-#: ../share/levels/bx3.scm:135
+#: ../share/levels/bx3.scm:139
 msgid "You must enter the Arena."
 msgstr ""
 
-#: ../share/levels/bx3.scm:195 ../share/levels/bx3.scm:202
+#: ../share/levels/bx3.scm:199 ../share/levels/bx3.scm:206
 msgid "A wall has been lowered."
 msgstr ""
 
-#: ../share/levels/bx3.scm:209
+#: ../share/levels/bx3.scm:213
 msgid "A roof has been raised."
 msgstr ""
 
-#: ../share/levels/bx3.scm:225
+#: ../share/levels/bx3.scm:229
 msgid "Stairs are in place."
 msgstr ""
 
-#: ../share/levels/bx3.scm:235
+#: ../share/levels/bx3.scm:239
 msgid "You may enter upper complex."
 msgstr ""
 
-#: ../share/levels/bx3.scm:249
+#: ../share/levels/bx3.scm:252
 msgid "The exit is now open."
 msgstr ""
 
@@ -1875,6 +1898,20 @@ msgstr ""
 msgid "Final and the last"
 msgstr ""
 
+#: ../share/levels/dn6.scm:37 ../share/levels/dn6.scm:73
+#, fuzzy
+msgid "Switch twice"
+msgstr "Interruttore:"
+
+#: ../share/levels/ds2.scm:3
+msgid "Orbit"
+msgstr ""
+
+#: ../share/levels/ds3.scm:3
+#, fuzzy
+msgid "Tunnel"
+msgstr "Tunnel:"
+
 #: ../share/levels/elite1.scm:3
 msgid "Castle of Darius the Mede"
 msgstr ""
@@ -2020,7 +2057,7 @@ msgstr ""
 msgid "The Castle"
 msgstr ""
 
-#: ../share/levels/mhm3.scm:24
+#: ../share/levels/mhm3.scm:15
 msgid "Stay on the path or else!"
 msgstr ""
 
@@ -2094,15 +2131,15 @@ msgstr ""
 msgid "The Marble HQ"
 msgstr ""
 
-#: ../share/levels/sl6.scm:203
+#: ../share/levels/sl6.scm:199
 msgid "The Marble HQ - Do not Enter!"
 msgstr ""
 
-#: ../share/levels/sl6.scm:344
+#: ../share/levels/sl6.scm:340
 msgid "Bonus"
 msgstr ""
 
-#: ../share/levels/sl6.scm:526
+#: ../share/levels/sl6.scm:521
 msgid "Commander's Hall"
 msgstr ""
 
diff --git a/po/sk.po b/po/sk.po
index 2080c80..9ff7851 100644
--- a/po/sk.po
+++ b/po/sk.po
@@ -6,7 +6,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: Trackballs\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-14 23:50-0400\n"
+"POT-Creation-Date: 2018-03-10 17:16-0500\n"
 "PO-Revision-Date: 2017-06-25 20:11-0400\n"
 "Last-Translator: Jozef Říha <jose1711 at gmail.com>\n"
 "Language-Team: Slovak <LL at li.org>\n"
@@ -64,384 +64,384 @@ msgid "Save point"
 msgstr "%d bodov"
 
 #. TRANSLATORS: This is a list of all the menus in the map editor.
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "File"
 msgstr "Súbor"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Edit"
 msgstr "Úpravy"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Color"
 msgstr "Farba"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Flags"
 msgstr "Vlajky"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Feature"
 msgstr "Vlastnosť"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Repair"
 msgstr ""
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Move"
 msgstr "Presunúť"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Window"
 msgstr "Okno"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "View"
 msgstr "Pohľad"
 
 #. TRANSLATORS: This is a list of all the submenus in the map
 #. editor, if the initial character is * or / then that character
 #. must be perserved as it is.
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "New"
 msgstr "Nový"
 
-#: ../src/editMode.cc:176 ../src/editWindows.cc:480
+#: ../src/editMode.cc:178 ../src/editWindows.cc:482
 msgid "Open"
 msgstr "Otvoriť"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Close"
 msgstr "Zatvoriť"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Save"
 msgstr "Uložiť"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Exit"
 msgstr "Ukon\\u010di\\u0165"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Test level"
 msgstr "Testovať level"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit height"
 msgstr "Upraviť výšku"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit color"
 msgstr "Upraviť farbu"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit water"
 msgstr "Upraviť vodu"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit velocity"
 msgstr "Upraviť rýchlosť"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit lines"
 msgstr "Upraviť čiary"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "*<SPACE> Whole cell"
 msgstr "*<SPACE> Celá bunka"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Upper corner"
 msgstr "Horný roh"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Bottom corner"
 msgstr "Spodný roh"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Right corner"
 msgstr "Pravý roh"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Left corner"
 msgstr "Ľavý roh"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Center"
 msgstr "Stred"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Raise increment"
 msgstr "Prírastok"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Lower increment"
 msgstr "Úbytok"
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<SHIFT> reversed"
 msgstr ""
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<CTRL> walls"
 msgstr "*<CTRL> steny"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. red"
 msgstr "Prid. červenej"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. green"
 msgstr "Prid. zelenej"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. blue"
 msgstr "Prid. modrej"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. alpha"
 msgstr "Prid. alpha"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Ice"
 msgstr "Ľad"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198 ../share/levels/lv2.scm:4
+#: ../src/editMode.cc:184 ../src/editMode.cc:200 ../share/levels/lv2.scm:4
 msgid "Acid"
 msgstr "Kyselina"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Sand"
 msgstr "Piesok"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "Kill"
 msgstr "Zabiť"
 
-#: ../src/editMode.cc:182
+#: ../src/editMode.cc:184
 msgid "Bounce"
 msgstr "Skákať"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "No grid"
 msgstr "Bez mriežky"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:200
+#: ../src/editMode.cc:184 ../src/editMode.cc:202
 msgid "Track"
 msgstr "Stopa"
 
-#: ../src/editMode.cc:183 ../src/editMode.cc:200
+#: ../src/editMode.cc:185 ../src/editMode.cc:202
 msgid "Shade flat"
 msgstr ""
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "Texture"
 msgstr "Textúra"
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "ch. texture"
 msgstr "ch. textúra"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Spike"
 msgstr "Bodce"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Small hill"
 msgstr "Malý kopec"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Medium hill"
 msgstr "Stredný kopec"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Large hill"
 msgstr "Veľký kopec"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Huge hill"
 msgstr "Obrovský kopec"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth small"
 msgstr "Vyhladiť malú oblasť"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth large"
 msgstr "Vyhladiť veľkú oblasť"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Cell cont."
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Water cont."
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 #, fuzzy
 msgid "Color cont."
 msgstr "Farba"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 #, fuzzy
 msgid "Cell center"
 msgstr "Stred"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Water center"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 #, fuzzy
 msgid "Color center"
 msgstr "Stred"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Cell round"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 #, fuzzy
 msgid "Water round"
 msgstr "Vypnut zvuk."
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 #, fuzzy
 msgid "Color round"
 msgstr "Farba"
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 msgid "Vel. round"
 msgstr ""
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/UP Move up"
 msgstr "/UP Hore"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/DOWN Move down"
 msgstr "/DOWN Dole"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/LEFT Move left"
 msgstr "/LEFT Vľavo"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/RIGHT Move right"
 msgstr "/RIGHT Vpravo"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map up"
 msgstr "Posunúť mapu dole"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map down"
 msgstr "Posunúť mapu dole"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map left"
 msgstr "Posunúť mapu vľavo"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map right"
 msgstr "Posunúť mapu vpravo"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "*<SHIFT> x5"
 msgstr "*<SHIFT> x5"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Set region marker"
 msgstr "Nastaviť značku"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Clear marker"
 msgstr "Vymazať značku"
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Copy region"
 msgstr "Kopírovať oblasť"
 
-#: ../src/editMode.cc:192
+#: ../src/editMode.cc:194
 msgid "Paste region"
 msgstr "Vložiť oblasť"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Editor"
 msgstr "Editor"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Toolbar"
 msgstr "Lišta nástrojov"
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Status"
 msgstr "Stav"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Birds's eye"
 msgstr "Vtáčia perspektíva"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Rotate view"
 msgstr "Otáčať pohľad"
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Load entities"
 msgstr ""
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Clear entities"
 msgstr ""
 
-#: ../src/editMode.cc:199
+#: ../src/editMode.cc:201
 msgid "Trampoline"
 msgstr "Trampolína"
 
-#: ../src/editMode.cc:204
+#: ../src/editMode.cc:206
 msgid "Small smooth"
 msgstr ""
 
-#: ../src/editMode.cc:205
+#: ../src/editMode.cc:207
 msgid "Large smooth"
 msgstr ""
 
-#: ../src/editMode.cc:341 ../src/mainMode.cc:178
+#: ../src/editMode.cc:343 ../src/mainMode.cc:175
 msgid "Track:"
 msgstr "Stopa:"
 
-#: ../src/editMode.cc:342
+#: ../src/editMode.cc:344
 msgid "This is the default script file for this track."
 msgstr "Toto je východzí skript pre túto stopu."
 
-#: ../src/editMode.cc:344
+#: ../src/editMode.cc:346
 msgid "Read the documentation for the editor and look at the examples"
 msgstr "Preštudujte dokumentáciu k editoru a pozrite sa na príklady"
 
-#: ../src/editMode.cc:345
+#: ../src/editMode.cc:347
 msgid "to learn how to customize it"
 msgstr "pre kurz, ako ho upraviť"
 
-#: ../src/editMode.cc:348
+#: ../src/editMode.cc:350
 msgid "Enter your name here"
 msgstr ""
 
-#: ../src/editMode.cc:352
+#: ../src/editMode.cc:354
 #, fuzzy
 msgid "Add the name of the next level here"
 msgstr "Vezme vás do dalšieho levelu. "
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell height"
 msgstr "Výška bunky"
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell water height"
 msgstr "Výška bunky vody"
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Textures"
 msgstr "Textúry"
 
@@ -541,77 +541,78 @@ msgstr ""
 msgid "Lines"
 msgstr ""
 
-#: ../src/editWindows.cc:302
+#: ../src/editWindows.cc:304
 #, fuzzy
 msgid "spike"
 msgstr "Bodce"
 
-#: ../src/editWindows.cc:305
+#: ../src/editWindows.cc:307
 #, fuzzy
 msgid "small hill"
 msgstr "Malý kopec"
 
-#: ../src/editWindows.cc:308
+#: ../src/editWindows.cc:310
 #, fuzzy
 msgid "medium hill"
 msgstr "Stredný kopec"
 
-#: ../src/editWindows.cc:311
+#: ../src/editWindows.cc:313
 #, fuzzy
 msgid "large hill"
 msgstr "Veľký kopec"
 
-#: ../src/editWindows.cc:314
+#: ../src/editWindows.cc:316
 #, fuzzy
 msgid "huge hill"
 msgstr "Obrovský kopec"
 
-#: ../src/editWindows.cc:317
+#: ../src/editWindows.cc:319
 msgid "small smooth"
 msgstr ""
 
-#: ../src/editWindows.cc:320
+#: ../src/editWindows.cc:322
 msgid "large smooth"
 msgstr ""
 
-#: ../src/editWindows.cc:360
+#: ../src/editWindows.cc:362
 msgid "Quit without saving?"
 msgstr "Ukončiť bez uloženia?"
 
-#: ../src/editWindows.cc:361 ../src/editWindows.cc:400
-#: ../src/editWindows.cc:447 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:177
-#: ../src/settingsMode.cc:179 ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:363 ../src/editWindows.cc:402
+#: ../src/editWindows.cc:449 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:180 ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:243
 msgid "Yes"
 msgstr "Áno"
 
-#: ../src/editWindows.cc:362 ../src/editWindows.cc:401
-#: ../src/editWindows.cc:448 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:138
-#: ../src/settingsMode.cc:177 ../src/settingsMode.cc:179
-#: ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:364 ../src/editWindows.cc:403
+#: ../src/editWindows.cc:450 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:139
+#: ../src/settingsMode.cc:178 ../src/settingsMode.cc:180
+#: ../src/settingsMode.cc:194 ../src/settingsMode.cc:243
 #, c-format
 msgid "No"
 msgstr "Nie"
 
-#: ../src/editWindows.cc:399
+#: ../src/editWindows.cc:401
 msgid "Save map?"
 msgstr "Uložiť mapu?"
 
-#: ../src/editWindows.cc:403
+#: ../src/editWindows.cc:405
 msgid "Saving"
 msgstr "Ukladanie"
 
-#: ../src/editWindows.cc:446
+#: ../src/editWindows.cc:448
 #, fuzzy
 msgid "Close without saving?"
 msgstr "Ukončiť bez uloženia?"
 
-#: ../src/editWindows.cc:477
+#: ../src/editWindows.cc:479
 msgid "Name of map"
 msgstr "Názov mapy"
 
-#: ../src/editWindows.cc:479 ../src/editWindows.cc:536
+#: ../src/editWindows.cc:481 ../src/editWindows.cc:536
 msgid "Cancel"
 msgstr "Zrušiť"
 
@@ -642,17 +643,17 @@ msgstr ""
 msgid "John Doe"
 msgstr ""
 
-#: ../src/glHelp.cc:1264
+#: ../src/glHelp.cc:1258
 #, c-format
 msgid "Framerate: %.1f"
 msgstr "Rýchlosť snímkov: %.1f"
 
-#: ../src/glHelp.cc:1266
+#: ../src/glHelp.cc:1260
 #, c-format
 msgid "Framerate unknown"
 msgstr "Rýchlosť snímkov neznáma"
 
-#: ../src/glHelp.cc:1268
+#: ../src/glHelp.cc:1262
 #, c-format
 msgid "%.1f ms/Frame"
 msgstr ""
@@ -839,15 +840,10 @@ msgstr "Presunie vás na iné miesto, niekedy pridá rýchlosť."
 msgid "More Help"
 msgstr "Ďalšia pomoc"
 
-#: ../src/helpMode.cc:287 ../src/hofMode.cc:107 ../src/settingsMode.cc:242
+#: ../src/helpMode.cc:287 ../src/hofMode.cc:110 ../src/settingsMode.cc:254
 msgid "Back"
 msgstr "Späť"
 
-#: ../src/highScore.cc:39
-#, c-format
-msgid "Anonymous Coward"
-msgstr ""
-
 #: ../src/hofMode.cc:89
 msgid "High Scores"
 msgstr ""
@@ -856,124 +852,126 @@ msgstr ""
 msgid "Level Set"
 msgstr ""
 
-#: ../src/hofMode.cc:101
+#: ../src/hofMode.cc:100
+msgid "Anonymous Coward"
+msgstr ""
+
+#: ../src/hofMode.cc:104
 #, c-format
 msgid "%d points"
 msgstr "%d bodov"
 
-#: ../src/mainMode.cc:180
+#: ../src/mainMode.cc:179 ../src/setupMode.cc:227
+msgid "Unknown track"
+msgstr "Neznáma stopa"
+
+#: ../src/mainMode.cc:181
 msgid "Author:"
 msgstr "Autor:"
 
-#: ../src/mainMode.cc:182
+#: ../src/mainMode.cc:185
+msgid "Unknown author"
+msgstr "Neznámy autor"
+
+#: ../src/mainMode.cc:187
 msgid "Press spacebar to begin"
 msgstr "Stlačte medzerník pre štart"
 
-#: ../src/mainMode.cc:194 ../src/mainMode.cc:203 ../src/mainMode.cc:229
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:199 ../src/mainMode.cc:208 ../src/mainMode.cc:234
+#: ../src/mainMode.cc:248
 #, c-format
 msgid "Press spacebar to continue"
 msgstr "Stlačte medzerník pre pokračovanie"
 
-#: ../src/mainMode.cc:195
+#: ../src/mainMode.cc:200
 msgid "Game over"
 msgstr "Koniec hry"
 
-#: ../src/mainMode.cc:203
+#: ../src/mainMode.cc:208
 msgid "Oops"
 msgstr "Ups"
 
-#: ../src/mainMode.cc:220
+#: ../src/mainMode.cc:225
 msgid "Paused"
 msgstr "Pauza"
 
-#: ../src/mainMode.cc:229
+#: ../src/mainMode.cc:234
 msgid "Bonus level complete"
 msgstr "Bonusový level kompletný"
 
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:248
 msgid "Level complete"
 msgstr "Level kompletný"
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "Congratulations"
 msgstr "Gratulujem"
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "You have completed the game!"
 msgstr "Úspešne ste ukončili hru!"
 
-#: ../src/mainMode.cc:542 ../src/mainMode.cc:558
+#: ../src/mainMode.cc:546 ../src/mainMode.cc:561
 msgid "Good luck!"
 msgstr "Veľa šťastia!"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 #, fuzzy
 msgid "Lives"
 msgstr "Ešte životov:"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Score"
 msgstr ""
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 #, fuzzy
 msgid "Time left"
 msgstr "Ešte času:"
 
-#: ../src/mainMode.cc:653
+#: ../src/mainMode.cc:656
 #, c-format
 msgid "Level bonuses"
 msgstr "Bonusové levely"
 
-#: ../src/mainMode.cc:655
+#: ../src/mainMode.cc:658
 #, c-format
 msgid "Lives left:"
 msgstr "Ešte životov:"
 
-#: ../src/mainMode.cc:656
+#: ../src/mainMode.cc:659
 #, c-format
 msgid "%d x 100 = %d points"
 msgstr "%d x 100 = %d bodov"
 
-#: ../src/mainMode.cc:657
+#: ../src/mainMode.cc:660
 #, c-format
 msgid "Time left:"
 msgstr "Ešte času:"
 
-#: ../src/mainMode.cc:658
+#: ../src/mainMode.cc:661
 #, c-format
 msgid "%d minutes = %d points"
 msgstr "%d minút = %d bodov"
 
-#: ../src/mainMode.cc:660
+#: ../src/mainMode.cc:663
 #, c-format
 msgid "Difficulty:"
 msgstr "Náročnosť"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "easy"
 msgstr "ľahká"
 
-#: ../src/mainMode.cc:662 ../src/settingsMode.cc:199
+#: ../src/mainMode.cc:665 ../src/settingsMode.cc:204
 #, c-format
 msgid "normal"
 msgstr "bežná"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "hard"
 msgstr "ťažká"
 
-#: ../src/map.cc:252
-#, c-format
-msgid "Unknown track"
-msgstr "Neznáma stopa"
-
-#: ../src/map.cc:253
-#, c-format
-msgid "Unknown author"
-msgstr "Neznámy autor"
-
 #: ../src/menuMode.cc:70
 msgid ""
 "Trackballs is a game similar to the classical game Marble Madness from the "
@@ -1014,328 +1012,341 @@ msgstr "Pomoc"
 msgid "Map Editor"
 msgstr "Editor máp"
 
-#: ../src/mmad.cc:214
+#: ../src/mmad.cc:213
 msgid "Usage:"
 msgstr "Použitie"
 
-#: ../src/mmad.cc:215
+#: ../src/mmad.cc:214
 msgid "[-w, -m] [-e, -l -t <level>] [-r <width>] [-s <sensitivity>]"
 msgstr "[-w, -m] [-e, -l -t <level>] [-r <sirka>] [-s <citlivost>]"
 
-#: ../src/mmad.cc:217
+#: ../src/mmad.cc:216
 msgid "Display this usage information."
 msgstr "Zobrazenie tohto navodu na pouzivanie."
 
-#: ../src/mmad.cc:218
+#: ../src/mmad.cc:217
 msgid "Start from level."
 msgstr "Spustit od levelu."
 
-#: ../src/mmad.cc:219
+#: ../src/mmad.cc:218
 msgid "Run in window (Default is fullscreen)"
 msgstr "Spustit v okne (vychodzie je na celu obrazovku"
 
-#: ../src/mmad.cc:220
+#: ../src/mmad.cc:219
 msgid "Mute sound."
 msgstr "Vypnut zvuk."
 
-#: ../src/mmad.cc:221
+#: ../src/mmad.cc:220
 msgid "Set resolution to 640, 800 or 1024"
 msgstr "Nastavit rozlisenia na 640, 800 alebo 1024"
 
-#: ../src/mmad.cc:222
+#: ../src/mmad.cc:221
 msgid "Mouse sensitivity, default 1.0"
 msgstr "Citlivost mysi, vychodzia 1.0"
 
-#: ../src/mmad.cc:223
+#: ../src/mmad.cc:222
 msgid "Displays framerate"
 msgstr " Zobrazovat rychlost snimkov"
 
-#: ../src/mmad.cc:224
+#: ../src/mmad.cc:223
 msgid "Prints current version number"
 msgstr "Zobrazi aktualne cislo verzie"
 
-#: ../src/mmad.cc:225
+#: ../src/mmad.cc:224
 msgid "Updates a map to the latest format"
 msgstr "Aktualizuje mapu na najnovsi format"
 
-#: ../src/mmad.cc:226
+#: ../src/mmad.cc:225
 msgid "Attempt to conserve memory usage"
 msgstr "Pokusi sa setrit spotrebu pamate"
 
-#: ../src/mmad.cc:227
+#: ../src/mmad.cc:226
 #, fuzzy
 msgid "Debug joystick status"
 msgstr "Pohnite joystickom hore"
 
-#: ../src/mmad.cc:228
+#: ../src/mmad.cc:227
 msgid "Correct for bad joysticks"
 msgstr "Oprava pre zle joysticky"
 
-#: ../src/mmad.cc:232
+#: ../src/mmad.cc:231
 msgid "Important keyboard shortcuts"
 msgstr "Dôležité klávesové skratky"
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Escape"
 msgstr "Escape"
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Soft quit"
 msgstr "Normálne ukončenie"
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "CapsLock"
 msgstr "CapsLock"
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "Unhide mouse pointer"
 msgstr "Zobraziť kurzor myši"
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "CTRL-q"
 msgstr "CTRL-q"
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "Quit the game immediately"
 msgstr "Okamžité ukončenie hry"
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "CTRL-f"
 msgstr "CTRL-f"
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "Toggle between fullscreen/windowed mode"
 msgstr "Prepína medzi plnoobrazovkovým a okenným režimom"
 
-#: ../src/mmad.cc:237
+#: ../src/mmad.cc:236
 msgid "Kill the ball"
 msgstr "Zrušiť guličku"
 
-#: ../src/mmad.cc:349
+#: ../src/mmad.cc:342
 #, c-format
 msgid "Unknown screen resolution of width %d"
 msgstr "Neznáme rozlíšenie šírky %d"
 
-#: ../src/mmad.cc:382
+#: ../src/mmad.cc:375
 msgid "Welcome to Trackballs."
 msgstr "Vitajte v hre Trackballs. "
 
-#: ../src/mmad.cc:384
+#: ../src/mmad.cc:377
 #, c-format
 msgid "Using %s as gamedata directory."
 msgstr "Používam %s ako adresár s dátami hry."
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Speed ball"
 msgstr ""
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 #, fuzzy
 msgid "Extra jump"
 msgstr "Extra"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 #, fuzzy
 msgid "Spikes"
 msgstr "Bodce"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Glass ball"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Dizzy!"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Freeze!"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Floating"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 #, fuzzy
 msgid "Extra life"
 msgstr "Extra"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 #, fuzzy
 msgid "Small ball"
 msgstr "Malý kopec"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 #, fuzzy
 msgid "Large ball"
 msgstr "Veľký kopec"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Nitro"
 msgstr ""
 
-#: ../src/settingsMode.cc:84
+#: ../src/settingsMode.cc:85
 msgid "Game Settings"
 msgstr "Nastavenia hry"
 
-#: ../src/settingsMode.cc:94
+#: ../src/settingsMode.cc:95
 #, c-format
 msgid "Is resolution %dx%dx%d ok?"
 msgstr "Je rozlíšenie %dx%d%d v poriadku?"
 
-#: ../src/settingsMode.cc:97
+#: ../src/settingsMode.cc:98
 #, fuzzy, c-format
 msgid "Is resolution Auto-%d ok?"
 msgstr "Je rozlíšenie %dx%d%d v poriadku?"
 
-#: ../src/settingsMode.cc:101
+#: ../src/settingsMode.cc:102
 msgid "Ok, use this resolution"
 msgstr "Áno, použi toto rozlíšenie"
 
-#: ../src/settingsMode.cc:102
+#: ../src/settingsMode.cc:103
 msgid "No, revert to old resolution"
 msgstr "Nie, vráť sa k minulému rozlíšeniu"
 
-#: ../src/settingsMode.cc:104
+#: ../src/settingsMode.cc:105
 #, c-format
 msgid "Timeout in %d seconds"
 msgstr "Timeout %d sekúnd"
 
-#: ../src/settingsMode.cc:116
+#: ../src/settingsMode.cc:117
 msgid "Video"
 msgstr ""
 
-#: ../src/settingsMode.cc:123
+#: ../src/settingsMode.cc:124
 #, c-format
 msgid "Auto-%d"
 msgstr ""
 
-#: ../src/settingsMode.cc:125
+#: ../src/settingsMode.cc:126
 msgid "Resolution"
 msgstr "Rozlíšenie"
 
-#: ../src/settingsMode.cc:126
+#: ../src/settingsMode.cc:127
 msgid "Test this resolution"
 msgstr "Vyskúšať toto rozlíšenie"
 
-#: ../src/settingsMode.cc:129
+#: ../src/settingsMode.cc:130
 msgid "Fullscreen"
 msgstr "Celá obrazovka"
 
-#: ../src/settingsMode.cc:132
+#: ../src/settingsMode.cc:133
 msgid "VSync"
 msgstr ""
 
-#: ../src/settingsMode.cc:141
+#: ../src/settingsMode.cc:142
 #, c-format
 msgid "Frame rate"
 msgstr "Rýchlosť snímkov"
 
-#: ../src/settingsMode.cc:144
+#: ../src/settingsMode.cc:145
 #, c-format
 msgid "Frame time"
 msgstr ""
 
-#: ../src/settingsMode.cc:147
+#: ../src/settingsMode.cc:148
 msgid "Show FPS"
 msgstr "Zobraziť rýchlosť snímkov"
 
-#: ../src/settingsMode.cc:152
+#: ../src/settingsMode.cc:153
 msgid "Graphics"
 msgstr "Grafika"
 
-#: ../src/settingsMode.cc:157
+#: ../src/settingsMode.cc:158
 #, c-format
 msgid "None"
 msgstr "Žiadne"
 
-#: ../src/settingsMode.cc:160
+#: ../src/settingsMode.cc:161
 #, c-format
 msgid "Minimalistic"
 msgstr "Minimalistické"
 
-#: ../src/settingsMode.cc:163
+#: ../src/settingsMode.cc:164
 #, c-format
 msgid "Simple"
 msgstr "Jednoduché"
 
-#: ../src/settingsMode.cc:166
+#: ../src/settingsMode.cc:167
 #, c-format
 msgid "Standard"
 msgstr "Štandardné"
 
-#: ../src/settingsMode.cc:169
+#: ../src/settingsMode.cc:170
 #, c-format
 msgid "Extra"
 msgstr "Extra"
 
-#: ../src/settingsMode.cc:172
+#: ../src/settingsMode.cc:173
 #, c-format
 msgid "Everything"
 msgstr "Všetko"
 
-#: ../src/settingsMode.cc:175
+#: ../src/settingsMode.cc:176
 msgid "Details"
 msgstr "Detaily"
 
-#: ../src/settingsMode.cc:176
+#: ../src/settingsMode.cc:177
 msgid "Reflections"
 msgstr "Odrazy (beta)"
 
-#: ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:179
 msgid "Shadows"
 msgstr "Zobraziť rýchlosť snímkov"
 
-#: ../src/settingsMode.cc:185
+#: ../src/settingsMode.cc:183
+#, fuzzy
+msgid "Shadow Resolution"
+msgstr "Rozlíšenie"
+
+#: ../src/settingsMode.cc:190
 msgid "Controls"
 msgstr "Ovládanie"
 
-#: ../src/settingsMode.cc:188
+#: ../src/settingsMode.cc:193
 msgid "Use mouse"
 msgstr "Používať myš"
 
-#: ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:199
 msgid "Sensitivity"
 msgstr "Citlivosť"
 
-#: ../src/settingsMode.cc:201
+#: ../src/settingsMode.cc:206
 #, c-format
 msgid "+%d degrees"
 msgstr "+%d stupňov"
 
-#: ../src/settingsMode.cc:203
+#: ../src/settingsMode.cc:208
 #, c-format
 msgid "-%d degrees"
 msgstr "-%d stupňov"
 
-#: ../src/settingsMode.cc:204
+#: ../src/settingsMode.cc:209
 msgid "Steering"
 msgstr "Manévrovanie"
 
-#: ../src/settingsMode.cc:211
+#: ../src/settingsMode.cc:216
 #, c-format
 msgid "no joystick found"
 msgstr "joystick nebol nájdený"
 
-#: ../src/settingsMode.cc:215
+#: ../src/settingsMode.cc:220
 msgid "Joystick:"
 msgstr "Joystick:"
 
-#: ../src/settingsMode.cc:225
+#: ../src/settingsMode.cc:230
 msgid "Other"
 msgstr "Iné"
 
-#: ../src/settingsMode.cc:229
+#: ../src/settingsMode.cc:233
+msgid "Language"
+msgstr "Jazyk"
+
+#: ../src/settingsMode.cc:237
 msgid "Music volume"
 msgstr "Hlasitosť hudby"
 
-#: ../src/settingsMode.cc:231
+#: ../src/settingsMode.cc:239
 msgid "Effects volume"
 msgstr "Hlasitosť efektov"
 
-#: ../src/settingsMode.cc:233
-msgid "Language"
-msgstr "Jazyk"
+#: ../src/settingsMode.cc:242
+msgid "Sandbox mode available"
+msgstr ""
+
+#: ../src/settingsMode.cc:246
+msgid "Time Compression"
+msgstr ""
 
 #: ../src/setupMode.cc:203
 msgid "Setup new game"
@@ -1353,55 +1364,55 @@ msgstr "N/A"
 msgid "Level"
 msgstr "Level"
 
-#: ../src/setupMode.cc:228
+#: ../src/setupMode.cc:231
 msgid "Difficulty"
 msgstr "Náročnosť"
 
-#: ../src/setupMode.cc:232
+#: ../src/setupMode.cc:235
 msgid "Sandbox (Easy)"
 msgstr "Sandbox (Ľahká)"
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Normal)"
 msgstr "Sandbox (Bežná)"
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Hard)"
 msgstr "Sandbox (Ťažká)"
 
-#: ../src/setupMode.cc:235
+#: ../src/setupMode.cc:238
 msgid "Easy"
 msgstr "Ľahká"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Normal"
 msgstr "Bežná"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Hard"
 msgstr "Ťažká"
 
-#: ../src/setupMode.cc:241
+#: ../src/setupMode.cc:244
 #, c-format
 msgid "Total games played: %d"
 msgstr "Všetkých odohraných hier: %d"
 
-#: ../src/setupMode.cc:245
+#: ../src/setupMode.cc:248
 #, c-format
 msgid "Average score: %d"
 msgstr "Priemerné skóre: %d"
 
-#: ../src/setupMode.cc:247
+#: ../src/setupMode.cc:250
 #, c-format
 msgid "Average score: N/A"
 msgstr "Priemerné skóre: nedostupné"
 
-#: ../src/setupMode.cc:250
+#: ../src/setupMode.cc:253
 #, c-format
 msgid "Levels completed: %d"
 msgstr "Hotových levelov: %d"
 
-#: ../src/setupMode.cc:262
+#: ../src/setupMode.cc:269
 msgid "Start Game"
 msgstr "Spustiť hru"
 
@@ -1505,6 +1516,18 @@ msgstr ""
 msgid "All made by Francek."
 msgstr ""
 
+#: ../share/levels/ds.set:1
+msgid "Don't stop"
+msgstr ""
+
+#: ../share/levels/ds.set:3 ../share/levels/ds1.scm:3
+msgid "Principia"
+msgstr ""
+
+#: ../share/levels/ds.set:4
+msgid "Or stay still and see what happens!"
+msgstr ""
+
 #: ../share/levels/elite.set:1
 msgid "Elite"
 msgstr ""
@@ -1710,15 +1733,15 @@ msgstr ""
 msgid "Four Doors"
 msgstr ""
 
-#: ../share/levels/bx2.scm:293
+#: ../share/levels/bx2.scm:304
 msgid "4 hidden switches open exit doors."
 msgstr ""
 
-#: ../share/levels/bx2.scm:295
+#: ../share/levels/bx2.scm:306
 msgid "A switch is nearby."
 msgstr ""
 
-#: ../share/levels/bx2.scm:297
+#: ../share/levels/bx2.scm:308
 msgid "Peace."
 msgstr ""
 
@@ -1726,36 +1749,36 @@ msgstr ""
 msgid "Azteca"
 msgstr ""
 
-#: ../share/levels/bx3.scm:107
+#: ../share/levels/bx3.scm:111
 #, fuzzy
 msgid "You have access to the complex."
 msgstr "Úspešne ste ukončili hru!"
 
-#: ../share/levels/bx3.scm:125
+#: ../share/levels/bx3.scm:129
 msgid "The way is opened across the sand."
 msgstr ""
 
-#: ../share/levels/bx3.scm:135
+#: ../share/levels/bx3.scm:139
 msgid "You must enter the Arena."
 msgstr ""
 
-#: ../share/levels/bx3.scm:195 ../share/levels/bx3.scm:202
+#: ../share/levels/bx3.scm:199 ../share/levels/bx3.scm:206
 msgid "A wall has been lowered."
 msgstr ""
 
-#: ../share/levels/bx3.scm:209
+#: ../share/levels/bx3.scm:213
 msgid "A roof has been raised."
 msgstr ""
 
-#: ../share/levels/bx3.scm:225
+#: ../share/levels/bx3.scm:229
 msgid "Stairs are in place."
 msgstr ""
 
-#: ../share/levels/bx3.scm:235
+#: ../share/levels/bx3.scm:239
 msgid "You may enter upper complex."
 msgstr ""
 
-#: ../share/levels/bx3.scm:249
+#: ../share/levels/bx3.scm:252
 msgid "The exit is now open."
 msgstr ""
 
@@ -1865,6 +1888,20 @@ msgstr ""
 msgid "Final and the last"
 msgstr ""
 
+#: ../share/levels/dn6.scm:37 ../share/levels/dn6.scm:73
+#, fuzzy
+msgid "Switch twice"
+msgstr "Prepnúť:"
+
+#: ../share/levels/ds2.scm:3
+msgid "Orbit"
+msgstr ""
+
+#: ../share/levels/ds3.scm:3
+#, fuzzy
+msgid "Tunnel"
+msgstr "Tunel:"
+
 #: ../share/levels/elite1.scm:3
 msgid "Castle of Darius the Mede"
 msgstr ""
@@ -2010,7 +2047,7 @@ msgstr ""
 msgid "The Castle"
 msgstr ""
 
-#: ../share/levels/mhm3.scm:24
+#: ../share/levels/mhm3.scm:15
 msgid "Stay on the path or else!"
 msgstr ""
 
@@ -2084,15 +2121,15 @@ msgstr ""
 msgid "The Marble HQ"
 msgstr ""
 
-#: ../share/levels/sl6.scm:203
+#: ../share/levels/sl6.scm:199
 msgid "The Marble HQ - Do not Enter!"
 msgstr ""
 
-#: ../share/levels/sl6.scm:344
+#: ../share/levels/sl6.scm:340
 msgid "Bonus"
 msgstr ""
 
-#: ../share/levels/sl6.scm:526
+#: ../share/levels/sl6.scm:521
 msgid "Commander's Hall"
 msgstr ""
 
diff --git a/po/sv.po b/po/sv.po
index ef6c641..0dd7596 100644
--- a/po/sv.po
+++ b/po/sv.po
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: v1.1.2\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-14 23:50-0400\n"
+"POT-Creation-Date: 2018-03-10 17:16-0500\n"
 "PO-Revision-Date: 2017-06-25 20:17-0400\n"
 "Last-Translator: Mathias <matbr at home.se>\n"
 "Language-Team: Swedish <sv at li.org>\n"
@@ -67,383 +67,383 @@ msgid "Save point"
 msgstr "%d poang"
 
 #. TRANSLATORS: This is a list of all the menus in the map editor.
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "File"
 msgstr "Filer"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Edit"
 msgstr "Editera"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Color"
 msgstr "Färg"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Flags"
 msgstr "Flaggor"
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Feature"
 msgstr ""
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Repair"
 msgstr ""
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Move"
 msgstr "Flytta"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Window"
 msgstr "Fönster"
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "View"
 msgstr "Visa"
 
 #. TRANSLATORS: This is a list of all the submenus in the map
 #. editor, if the initial character is * or / then that character
 #. must be perserved as it is.
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "New"
 msgstr "Ny"
 
-#: ../src/editMode.cc:176 ../src/editWindows.cc:480
+#: ../src/editMode.cc:178 ../src/editWindows.cc:482
 msgid "Open"
 msgstr "Öppna"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Close"
 msgstr "Stäng"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Save"
 msgstr "Spara"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Exit"
 msgstr "Avsluta"
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Test level"
 msgstr ""
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit height"
 msgstr "Editera höjd"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit color"
 msgstr "Editera färg"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit water"
 msgstr "Editera vatten"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit velocity"
 msgstr "Editera hastighet"
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit lines"
 msgstr "Editera linjer"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "*<SPACE> Whole cell"
 msgstr ""
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Upper corner"
 msgstr "Övre hörnet"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Bottom corner"
 msgstr "Nedre hörnet"
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Right corner"
 msgstr "Högra hörnet"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Left corner"
 msgstr "Vänstra hörnet"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Center"
 msgstr "Center"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Raise increment"
 msgstr "Höj inkrement"
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Lower increment"
 msgstr "Sänk increment"
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<SHIFT> reversed"
 msgstr "<SHIFT> motsatt riktning"
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<CTRL> walls"
 msgstr "<CTRL> väggar"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. red"
 msgstr "Oka röd"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. green"
 msgstr "Oka grön"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. blue"
 msgstr "Oka blå"
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. alpha"
 msgstr "Oka alpha"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Ice"
 msgstr "Is"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198 ../share/levels/lv2.scm:4
+#: ../src/editMode.cc:184 ../src/editMode.cc:200 ../share/levels/lv2.scm:4
 msgid "Acid"
 msgstr "Syra"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Sand"
 msgstr "Sand"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "Kill"
 msgstr "Döda"
 
-#: ../src/editMode.cc:182
+#: ../src/editMode.cc:184
 msgid "Bounce"
 msgstr "Studsa"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "No grid"
 msgstr "Inget rutnät"
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:200
+#: ../src/editMode.cc:184 ../src/editMode.cc:202
 msgid "Track"
 msgstr "Spår"
 
-#: ../src/editMode.cc:183 ../src/editMode.cc:200
+#: ../src/editMode.cc:185 ../src/editMode.cc:202
 msgid "Shade flat"
 msgstr ""
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "Texture"
 msgstr "Textur"
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "ch. texture"
 msgstr "Andra textur"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Spike"
 msgstr "Taggar"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Small hill"
 msgstr "Liten kulle"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Medium hill"
 msgstr "Medium kulle"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Large hill"
 msgstr "Stor kulle"
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Huge hill"
 msgstr "Enorm kulle"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth small"
 msgstr "Liten rundning"
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth large"
 msgstr "Stor rundning"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Cell cont."
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Water cont."
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 #, fuzzy
 msgid "Color cont."
 msgstr "Färg"
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 #, fuzzy
 msgid "Cell center"
 msgstr "Center"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Water center"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 #, fuzzy
 msgid "Color center"
 msgstr "Center"
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Cell round"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Water round"
 msgstr ""
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 #, fuzzy
 msgid "Color round"
 msgstr "Färg"
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 msgid "Vel. round"
 msgstr ""
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/UP Move up"
 msgstr "/UPP Flytta upp"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/DOWN Move down"
 msgstr "/NER Flytta ner"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/LEFT Move left"
 msgstr "/VÄNSTER Flytta vänster"
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/RIGHT Move right"
 msgstr "/HÖGER Flytta höger"
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map up"
 msgstr ""
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map down"
 msgstr ""
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map left"
 msgstr ""
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map right"
 msgstr ""
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "*<SHIFT> x5"
 msgstr ""
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Set region marker"
 msgstr ""
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Clear marker"
 msgstr ""
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Copy region"
 msgstr ""
 
-#: ../src/editMode.cc:192
+#: ../src/editMode.cc:194
 msgid "Paste region"
 msgstr ""
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Editor"
 msgstr ""
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Toolbar"
 msgstr ""
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Status"
 msgstr ""
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Birds's eye"
 msgstr ""
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Rotate view"
 msgstr ""
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Load entities"
 msgstr ""
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Clear entities"
 msgstr ""
 
-#: ../src/editMode.cc:199
+#: ../src/editMode.cc:201
 msgid "Trampoline"
 msgstr ""
 
-#: ../src/editMode.cc:204
+#: ../src/editMode.cc:206
 msgid "Small smooth"
 msgstr ""
 
-#: ../src/editMode.cc:205
+#: ../src/editMode.cc:207
 msgid "Large smooth"
 msgstr ""
 
-#: ../src/editMode.cc:341 ../src/mainMode.cc:178
+#: ../src/editMode.cc:343 ../src/mainMode.cc:175
 msgid "Track:"
 msgstr "Bana:"
 
-#: ../src/editMode.cc:342
+#: ../src/editMode.cc:344
 msgid "This is the default script file for this track."
 msgstr ""
 
-#: ../src/editMode.cc:344
+#: ../src/editMode.cc:346
 msgid "Read the documentation for the editor and look at the examples"
 msgstr ""
 
-#: ../src/editMode.cc:345
+#: ../src/editMode.cc:347
 msgid "to learn how to customize it"
 msgstr ""
 
-#: ../src/editMode.cc:348
+#: ../src/editMode.cc:350
 msgid "Enter your name here"
 msgstr ""
 
-#: ../src/editMode.cc:352
+#: ../src/editMode.cc:354
 #, fuzzy
 msgid "Add the name of the next level here"
 msgstr "Tar dig till nästa bana."
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell height"
 msgstr ""
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell water height"
 msgstr ""
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Textures"
 msgstr ""
 
@@ -543,77 +543,78 @@ msgstr ""
 msgid "Lines"
 msgstr ""
 
-#: ../src/editWindows.cc:302
+#: ../src/editWindows.cc:304
 #, fuzzy
 msgid "spike"
 msgstr "Taggar"
 
-#: ../src/editWindows.cc:305
+#: ../src/editWindows.cc:307
 #, fuzzy
 msgid "small hill"
 msgstr "Liten kulle"
 
-#: ../src/editWindows.cc:308
+#: ../src/editWindows.cc:310
 #, fuzzy
 msgid "medium hill"
 msgstr "Medium kulle"
 
-#: ../src/editWindows.cc:311
+#: ../src/editWindows.cc:313
 #, fuzzy
 msgid "large hill"
 msgstr "Stor kulle"
 
-#: ../src/editWindows.cc:314
+#: ../src/editWindows.cc:316
 #, fuzzy
 msgid "huge hill"
 msgstr "Enorm kulle"
 
-#: ../src/editWindows.cc:317
+#: ../src/editWindows.cc:319
 msgid "small smooth"
 msgstr ""
 
-#: ../src/editWindows.cc:320
+#: ../src/editWindows.cc:322
 msgid "large smooth"
 msgstr ""
 
-#: ../src/editWindows.cc:360
+#: ../src/editWindows.cc:362
 msgid "Quit without saving?"
 msgstr ""
 
-#: ../src/editWindows.cc:361 ../src/editWindows.cc:400
-#: ../src/editWindows.cc:447 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:177
-#: ../src/settingsMode.cc:179 ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:363 ../src/editWindows.cc:402
+#: ../src/editWindows.cc:449 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:180 ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:243
 msgid "Yes"
 msgstr "Ja"
 
-#: ../src/editWindows.cc:362 ../src/editWindows.cc:401
-#: ../src/editWindows.cc:448 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:138
-#: ../src/settingsMode.cc:177 ../src/settingsMode.cc:179
-#: ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:364 ../src/editWindows.cc:403
+#: ../src/editWindows.cc:450 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:139
+#: ../src/settingsMode.cc:178 ../src/settingsMode.cc:180
+#: ../src/settingsMode.cc:194 ../src/settingsMode.cc:243
 #, c-format
 msgid "No"
 msgstr "Nej"
 
-#: ../src/editWindows.cc:399
+#: ../src/editWindows.cc:401
 #, fuzzy
 msgid "Save map?"
 msgstr "Spara"
 
-#: ../src/editWindows.cc:403
+#: ../src/editWindows.cc:405
 msgid "Saving"
 msgstr ""
 
-#: ../src/editWindows.cc:446
+#: ../src/editWindows.cc:448
 msgid "Close without saving?"
 msgstr ""
 
-#: ../src/editWindows.cc:477
+#: ../src/editWindows.cc:479
 msgid "Name of map"
 msgstr ""
 
-#: ../src/editWindows.cc:479 ../src/editWindows.cc:536
+#: ../src/editWindows.cc:481 ../src/editWindows.cc:536
 msgid "Cancel"
 msgstr ""
 
@@ -645,17 +646,17 @@ msgstr ""
 msgid "John Doe"
 msgstr ""
 
-#: ../src/glHelp.cc:1264
+#: ../src/glHelp.cc:1258
 #, c-format
 msgid "Framerate: %.1f"
 msgstr "Framerate: %.1f"
 
-#: ../src/glHelp.cc:1266
+#: ../src/glHelp.cc:1260
 #, c-format
 msgid "Framerate unknown"
 msgstr "Okänd framerate"
 
-#: ../src/glHelp.cc:1268
+#: ../src/glHelp.cc:1262
 #, c-format
 msgid "%.1f ms/Frame"
 msgstr ""
@@ -844,15 +845,10 @@ msgstr "Tar dig till andra platser, ibland snabbt."
 msgid "More Help"
 msgstr "Hjälp"
 
-#: ../src/helpMode.cc:287 ../src/hofMode.cc:107 ../src/settingsMode.cc:242
+#: ../src/helpMode.cc:287 ../src/hofMode.cc:110 ../src/settingsMode.cc:254
 msgid "Back"
 msgstr ""
 
-#: ../src/highScore.cc:39
-#, c-format
-msgid "Anonymous Coward"
-msgstr ""
-
 #: ../src/hofMode.cc:89
 msgid "High Scores"
 msgstr ""
@@ -863,125 +859,127 @@ msgstr ""
 msgid "Level Set"
 msgstr "Banan avklarad"
 
-#: ../src/hofMode.cc:101
+#: ../src/hofMode.cc:100
+msgid "Anonymous Coward"
+msgstr ""
+
+#: ../src/hofMode.cc:104
 #, c-format
 msgid "%d points"
 msgstr "%d poang"
 
-#: ../src/mainMode.cc:180
+#: ../src/mainMode.cc:179 ../src/setupMode.cc:227
+msgid "Unknown track"
+msgstr ""
+
+#: ../src/mainMode.cc:181
 msgid "Author:"
 msgstr "Författare:"
 
-#: ../src/mainMode.cc:182
+#: ../src/mainMode.cc:185
+msgid "Unknown author"
+msgstr ""
+
+#: ../src/mainMode.cc:187
 msgid "Press spacebar to begin"
 msgstr "Tryck mellanslag for att borja"
 
-#: ../src/mainMode.cc:194 ../src/mainMode.cc:203 ../src/mainMode.cc:229
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:199 ../src/mainMode.cc:208 ../src/mainMode.cc:234
+#: ../src/mainMode.cc:248
 #, c-format
 msgid "Press spacebar to continue"
 msgstr "Tryck mellanslag for att fortsatta"
 
-#: ../src/mainMode.cc:195
+#: ../src/mainMode.cc:200
 msgid "Game over"
 msgstr "Spelet slut"
 
-#: ../src/mainMode.cc:203
+#: ../src/mainMode.cc:208
 msgid "Oops"
 msgstr "Hopsan!"
 
-#: ../src/mainMode.cc:220
+#: ../src/mainMode.cc:225
 msgid "Paused"
 msgstr "Pausat"
 
-#: ../src/mainMode.cc:229
+#: ../src/mainMode.cc:234
 msgid "Bonus level complete"
 msgstr "Bonus level fardig"
 
 # Level fardig
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:248
 msgid "Level complete"
 msgstr "Banan avklarad"
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "Congratulations"
 msgstr ""
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "You have completed the game!"
 msgstr ""
 
-#: ../src/mainMode.cc:542 ../src/mainMode.cc:558
+#: ../src/mainMode.cc:546 ../src/mainMode.cc:561
 msgid "Good luck!"
 msgstr "Lycka till!"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 #, fuzzy
 msgid "Lives"
 msgstr "Liv kvar"
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Score"
 msgstr ""
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 #, fuzzy
 msgid "Time left"
 msgstr "Tid kvar:"
 
-#: ../src/mainMode.cc:653
+#: ../src/mainMode.cc:656
 #, c-format
 msgid "Level bonuses"
 msgstr "Level bonusar"
 
-#: ../src/mainMode.cc:655
+#: ../src/mainMode.cc:658
 #, c-format
 msgid "Lives left:"
 msgstr "Liv kvar"
 
-#: ../src/mainMode.cc:656
+#: ../src/mainMode.cc:659
 #, c-format
 msgid "%d x 100 = %d points"
 msgstr "%d x 100 = %d poang"
 
-#: ../src/mainMode.cc:657
+#: ../src/mainMode.cc:660
 #, c-format
 msgid "Time left:"
 msgstr "Tid kvar:"
 
-#: ../src/mainMode.cc:658
+#: ../src/mainMode.cc:661
 #, c-format
 msgid "%d minutes = %d points"
 msgstr "%d minuter = %d poang"
 
-#: ../src/mainMode.cc:660
+#: ../src/mainMode.cc:663
 #, c-format
 msgid "Difficulty:"
 msgstr "Svarighetsgrad"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "easy"
 msgstr "lätt"
 
-#: ../src/mainMode.cc:662 ../src/settingsMode.cc:199
+#: ../src/mainMode.cc:665 ../src/settingsMode.cc:204
 #, c-format
 msgid "normal"
 msgstr "normalt"
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "hard"
 msgstr "svårt"
 
-#: ../src/map.cc:252
-#, c-format
-msgid "Unknown track"
-msgstr ""
-
-#: ../src/map.cc:253
-#, c-format
-msgid "Unknown author"
-msgstr ""
-
 #: ../src/menuMode.cc:70
 msgid ""
 "Trackballs is a game similar to the classical game Marble Madness from the "
@@ -1023,327 +1021,340 @@ msgstr "Hjälp"
 msgid "Map Editor"
 msgstr ""
 
-#: ../src/mmad.cc:214
+#: ../src/mmad.cc:213
 msgid "Usage:"
 msgstr "Användning: "
 
-#: ../src/mmad.cc:215
+#: ../src/mmad.cc:214
 msgid "[-w, -m] [-e, -l -t <level>] [-r <width>] [-s <sensitivity>]"
 msgstr "[-w, -m] [-e, -l -t <level>] [-r <bredd>] [-s <känslighet>]"
 
-#: ../src/mmad.cc:217
+#: ../src/mmad.cc:216
 msgid "Display this usage information."
 msgstr "Visa användningsinformation."
 
-#: ../src/mmad.cc:218
+#: ../src/mmad.cc:217
 msgid "Start from level."
 msgstr "Starta från level."
 
-#: ../src/mmad.cc:219
+#: ../src/mmad.cc:218
 msgid "Run in window (Default is fullscreen)"
 msgstr "Kör i fönsterläge (Default är fullscreen)"
 
-#: ../src/mmad.cc:220
+#: ../src/mmad.cc:219
 msgid "Mute sound."
 msgstr "Inget ljud."
 
-#: ../src/mmad.cc:221
+#: ../src/mmad.cc:220
 msgid "Set resolution to 640, 800 or 1024"
 msgstr "Sätt upplösningen till 640, 800 or 1024 punkter"
 
-#: ../src/mmad.cc:222
+#: ../src/mmad.cc:221
 msgid "Mouse sensitivity, default 1.0"
 msgstr "Känslighet för musen, default är 1.0"
 
-#: ../src/mmad.cc:223
+#: ../src/mmad.cc:222
 msgid "Displays framerate"
 msgstr "Visa framerate"
 
-#: ../src/mmad.cc:224
+#: ../src/mmad.cc:223
 msgid "Prints current version number"
 msgstr "Skrivut nuvarande version number"
 
-#: ../src/mmad.cc:225
+#: ../src/mmad.cc:224
 msgid "Updates a map to the latest format"
 msgstr "Uppdaterar en karta till den senaste versionen"
 
-#: ../src/mmad.cc:226
+#: ../src/mmad.cc:225
 msgid "Attempt to conserve memory usage"
 msgstr "Spara på minnesanvändandet"
 
-#: ../src/mmad.cc:227
+#: ../src/mmad.cc:226
 msgid "Debug joystick status"
 msgstr ""
 
-#: ../src/mmad.cc:228
+#: ../src/mmad.cc:227
 msgid "Correct for bad joysticks"
 msgstr "Korrigera för dålig joystick"
 
-#: ../src/mmad.cc:232
+#: ../src/mmad.cc:231
 msgid "Important keyboard shortcuts"
 msgstr ""
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Escape"
 msgstr ""
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Soft quit"
 msgstr ""
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "CapsLock"
 msgstr ""
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "Unhide mouse pointer"
 msgstr ""
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "CTRL-q"
 msgstr ""
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "Quit the game immediately"
 msgstr ""
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "CTRL-f"
 msgstr ""
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "Toggle between fullscreen/windowed mode"
 msgstr ""
 
-#: ../src/mmad.cc:237
+#: ../src/mmad.cc:236
 msgid "Kill the ball"
 msgstr ""
 
-#: ../src/mmad.cc:349
+#: ../src/mmad.cc:342
 #, c-format
 msgid "Unknown screen resolution of width %d"
 msgstr "Okand skärmupplösning av bredd %d"
 
-#: ../src/mmad.cc:382
+#: ../src/mmad.cc:375
 msgid "Welcome to Trackballs."
 msgstr "Välkommen till Trackballs."
 
-#: ../src/mmad.cc:384
+#: ../src/mmad.cc:377
 #, c-format
 msgid "Using %s as gamedata directory."
 msgstr "Anvander direktory %s för speldata."
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Speed ball"
 msgstr ""
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 #, fuzzy
 msgid "Extra jump"
 msgstr "Extra"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 #, fuzzy
 msgid "Spikes"
 msgstr "Taggar"
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Glass ball"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Dizzy!"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Freeze!"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Floating"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 #, fuzzy
 msgid "Extra life"
 msgstr "Extra"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 #, fuzzy
 msgid "Small ball"
 msgstr "Liten kulle"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 #, fuzzy
 msgid "Large ball"
 msgstr "Stor kulle"
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Nitro"
 msgstr ""
 
-#: ../src/settingsMode.cc:84
+#: ../src/settingsMode.cc:85
 #, fuzzy
 msgid "Game Settings"
 msgstr "Inställningar"
 
-#: ../src/settingsMode.cc:94
+#: ../src/settingsMode.cc:95
 #, c-format
 msgid "Is resolution %dx%dx%d ok?"
 msgstr ""
 
-#: ../src/settingsMode.cc:97
+#: ../src/settingsMode.cc:98
 #, c-format
 msgid "Is resolution Auto-%d ok?"
 msgstr ""
 
-#: ../src/settingsMode.cc:101
+#: ../src/settingsMode.cc:102
 msgid "Ok, use this resolution"
 msgstr ""
 
-#: ../src/settingsMode.cc:102
+#: ../src/settingsMode.cc:103
 msgid "No, revert to old resolution"
 msgstr ""
 
-#: ../src/settingsMode.cc:104
+#: ../src/settingsMode.cc:105
 #, c-format
 msgid "Timeout in %d seconds"
 msgstr ""
 
-#: ../src/settingsMode.cc:116
+#: ../src/settingsMode.cc:117
 msgid "Video"
 msgstr ""
 
-#: ../src/settingsMode.cc:123
+#: ../src/settingsMode.cc:124
 #, c-format
 msgid "Auto-%d"
 msgstr ""
 
-#: ../src/settingsMode.cc:125
+#: ../src/settingsMode.cc:126
 msgid "Resolution"
 msgstr "Upplösning"
 
-#: ../src/settingsMode.cc:126
+#: ../src/settingsMode.cc:127
 msgid "Test this resolution"
 msgstr ""
 
-#: ../src/settingsMode.cc:129
+#: ../src/settingsMode.cc:130
 msgid "Fullscreen"
 msgstr "Fullskärm"
 
-#: ../src/settingsMode.cc:132
+#: ../src/settingsMode.cc:133
 msgid "VSync"
 msgstr ""
 
-#: ../src/settingsMode.cc:141
+#: ../src/settingsMode.cc:142
 #, c-format
 msgid "Frame rate"
 msgstr ""
 
-#: ../src/settingsMode.cc:144
+#: ../src/settingsMode.cc:145
 #, c-format
 msgid "Frame time"
 msgstr ""
 
-#: ../src/settingsMode.cc:147
+#: ../src/settingsMode.cc:148
 msgid "Show FPS"
 msgstr "Visa FPS"
 
-#: ../src/settingsMode.cc:152
+#: ../src/settingsMode.cc:153
 msgid "Graphics"
 msgstr "Grafik"
 
-#: ../src/settingsMode.cc:157
+#: ../src/settingsMode.cc:158
 #, c-format
 msgid "None"
 msgstr "Ingen"
 
-#: ../src/settingsMode.cc:160
+#: ../src/settingsMode.cc:161
 #, c-format
 msgid "Minimalistic"
 msgstr "Minimalistisk"
 
-#: ../src/settingsMode.cc:163
+#: ../src/settingsMode.cc:164
 #, c-format
 msgid "Simple"
 msgstr "Enkel"
 
-#: ../src/settingsMode.cc:166
+#: ../src/settingsMode.cc:167
 #, c-format
 msgid "Standard"
 msgstr "Standard"
 
-#: ../src/settingsMode.cc:169
+#: ../src/settingsMode.cc:170
 #, c-format
 msgid "Extra"
 msgstr "Extra"
 
-#: ../src/settingsMode.cc:172
+#: ../src/settingsMode.cc:173
 #, c-format
 msgid "Everything"
 msgstr "Allt"
 
-#: ../src/settingsMode.cc:175
+#: ../src/settingsMode.cc:176
 msgid "Details"
 msgstr "Detaljer"
 
-#: ../src/settingsMode.cc:176
+#: ../src/settingsMode.cc:177
 msgid "Reflections"
 msgstr "Reflektioner"
 
-#: ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:179
 msgid "Shadows"
 msgstr ""
 
-#: ../src/settingsMode.cc:185
+#: ../src/settingsMode.cc:183
+#, fuzzy
+msgid "Shadow Resolution"
+msgstr "Upplösning"
+
+#: ../src/settingsMode.cc:190
 msgid "Controls"
 msgstr "Kontroller"
 
-#: ../src/settingsMode.cc:188
+#: ../src/settingsMode.cc:193
 msgid "Use mouse"
 msgstr "Använd musen"
 
-#: ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:199
 msgid "Sensitivity"
 msgstr "Känslighet"
 
-#: ../src/settingsMode.cc:201
+#: ../src/settingsMode.cc:206
 #, c-format
 msgid "+%d degrees"
 msgstr ""
 
-#: ../src/settingsMode.cc:203
+#: ../src/settingsMode.cc:208
 #, c-format
 msgid "-%d degrees"
 msgstr ""
 
-#: ../src/settingsMode.cc:204
+#: ../src/settingsMode.cc:209
 msgid "Steering"
 msgstr ""
 
-#: ../src/settingsMode.cc:211
+#: ../src/settingsMode.cc:216
 #, fuzzy, c-format
 msgid "no joystick found"
 msgstr "Styr nedat"
 
-#: ../src/settingsMode.cc:215
+#: ../src/settingsMode.cc:220
 msgid "Joystick:"
 msgstr ""
 
-#: ../src/settingsMode.cc:225
+#: ../src/settingsMode.cc:230
 msgid "Other"
 msgstr "Annat"
 
-#: ../src/settingsMode.cc:229
+#: ../src/settingsMode.cc:233
+msgid "Language"
+msgstr ""
+
+#: ../src/settingsMode.cc:237
 msgid "Music volume"
 msgstr "Musik volym"
 
-#: ../src/settingsMode.cc:231
+#: ../src/settingsMode.cc:239
 msgid "Effects volume"
 msgstr "Ljudeffektsvolym"
 
-#: ../src/settingsMode.cc:233
-msgid "Language"
+#: ../src/settingsMode.cc:242
+msgid "Sandbox mode available"
+msgstr ""
+
+#: ../src/settingsMode.cc:246
+msgid "Time Compression"
 msgstr ""
 
 #: ../src/setupMode.cc:203
@@ -1362,57 +1373,57 @@ msgstr ""
 msgid "Level"
 msgstr ""
 
-#: ../src/setupMode.cc:228
+#: ../src/setupMode.cc:231
 #, fuzzy
 msgid "Difficulty"
 msgstr "Svarighetsgrad"
 
-#: ../src/setupMode.cc:232
+#: ../src/setupMode.cc:235
 msgid "Sandbox (Easy)"
 msgstr ""
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Normal)"
 msgstr ""
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Hard)"
 msgstr ""
 
-#: ../src/setupMode.cc:235
+#: ../src/setupMode.cc:238
 msgid "Easy"
 msgstr "Lätt"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Normal"
 msgstr "Normalt"
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Hard"
 msgstr "Svårt"
 
-#: ../src/setupMode.cc:241
+#: ../src/setupMode.cc:244
 #, c-format
 msgid "Total games played: %d"
 msgstr ""
 
-#: ../src/setupMode.cc:245
+#: ../src/setupMode.cc:248
 #, c-format
 msgid "Average score: %d"
 msgstr ""
 
-#: ../src/setupMode.cc:247
+#: ../src/setupMode.cc:250
 #, c-format
 msgid "Average score: N/A"
 msgstr ""
 
 # Level fardig
-#: ../src/setupMode.cc:250
+#: ../src/setupMode.cc:253
 #, fuzzy, c-format
 msgid "Levels completed: %d"
 msgstr "Banan avklarad"
 
-#: ../src/setupMode.cc:262
+#: ../src/setupMode.cc:269
 msgid "Start Game"
 msgstr ""
 
@@ -1516,6 +1527,18 @@ msgstr ""
 msgid "All made by Francek."
 msgstr ""
 
+#: ../share/levels/ds.set:1
+msgid "Don't stop"
+msgstr ""
+
+#: ../share/levels/ds.set:3 ../share/levels/ds1.scm:3
+msgid "Principia"
+msgstr ""
+
+#: ../share/levels/ds.set:4
+msgid "Or stay still and see what happens!"
+msgstr ""
+
 #: ../share/levels/elite.set:1
 msgid "Elite"
 msgstr ""
@@ -1720,15 +1743,15 @@ msgstr ""
 msgid "Four Doors"
 msgstr ""
 
-#: ../share/levels/bx2.scm:293
+#: ../share/levels/bx2.scm:304
 msgid "4 hidden switches open exit doors."
 msgstr ""
 
-#: ../share/levels/bx2.scm:295
+#: ../share/levels/bx2.scm:306
 msgid "A switch is nearby."
 msgstr ""
 
-#: ../share/levels/bx2.scm:297
+#: ../share/levels/bx2.scm:308
 msgid "Peace."
 msgstr ""
 
@@ -1736,35 +1759,35 @@ msgstr ""
 msgid "Azteca"
 msgstr ""
 
-#: ../share/levels/bx3.scm:107
+#: ../share/levels/bx3.scm:111
 msgid "You have access to the complex."
 msgstr ""
 
-#: ../share/levels/bx3.scm:125
+#: ../share/levels/bx3.scm:129
 msgid "The way is opened across the sand."
 msgstr ""
 
-#: ../share/levels/bx3.scm:135
+#: ../share/levels/bx3.scm:139
 msgid "You must enter the Arena."
 msgstr ""
 
-#: ../share/levels/bx3.scm:195 ../share/levels/bx3.scm:202
+#: ../share/levels/bx3.scm:199 ../share/levels/bx3.scm:206
 msgid "A wall has been lowered."
 msgstr ""
 
-#: ../share/levels/bx3.scm:209
+#: ../share/levels/bx3.scm:213
 msgid "A roof has been raised."
 msgstr ""
 
-#: ../share/levels/bx3.scm:225
+#: ../share/levels/bx3.scm:229
 msgid "Stairs are in place."
 msgstr ""
 
-#: ../share/levels/bx3.scm:235
+#: ../share/levels/bx3.scm:239
 msgid "You may enter upper complex."
 msgstr ""
 
-#: ../share/levels/bx3.scm:249
+#: ../share/levels/bx3.scm:252
 msgid "The exit is now open."
 msgstr ""
 
@@ -1874,6 +1897,20 @@ msgstr ""
 msgid "Final and the last"
 msgstr ""
 
+#: ../share/levels/dn6.scm:37 ../share/levels/dn6.scm:73
+#, fuzzy
+msgid "Switch twice"
+msgstr "Spak:"
+
+#: ../share/levels/ds2.scm:3
+msgid "Orbit"
+msgstr ""
+
+#: ../share/levels/ds3.scm:3
+#, fuzzy
+msgid "Tunnel"
+msgstr "Tunnel:"
+
 #: ../share/levels/elite1.scm:3
 msgid "Castle of Darius the Mede"
 msgstr ""
@@ -2018,7 +2055,7 @@ msgstr ""
 msgid "The Castle"
 msgstr ""
 
-#: ../share/levels/mhm3.scm:24
+#: ../share/levels/mhm3.scm:15
 msgid "Stay on the path or else!"
 msgstr ""
 
@@ -2092,15 +2129,15 @@ msgstr ""
 msgid "The Marble HQ"
 msgstr ""
 
-#: ../share/levels/sl6.scm:203
+#: ../share/levels/sl6.scm:199
 msgid "The Marble HQ - Do not Enter!"
 msgstr ""
 
-#: ../share/levels/sl6.scm:344
+#: ../share/levels/sl6.scm:340
 msgid "Bonus"
 msgstr ""
 
-#: ../share/levels/sl6.scm:526
+#: ../share/levels/sl6.scm:521
 msgid "Commander's Hall"
 msgstr ""
 
diff --git a/po/trackballs.pot b/po/trackballs.pot
index d846756..27991aa 100644
--- a/po/trackballs.pot
+++ b/po/trackballs.pot
@@ -8,7 +8,7 @@ msgid ""
 msgstr ""
 "Project-Id-Version: PACKAGE VERSION\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2017-10-16 09:42-0400\n"
+"POT-Creation-Date: 2018-03-10 18:53-0500\n"
 "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
 "Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
 "Language-Team: LANGUAGE <LL at li.org>\n"
@@ -64,378 +64,378 @@ msgid "Save point"
 msgstr ""
 
 #. TRANSLATORS: This is a list of all the menus in the map editor.
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "File"
 msgstr ""
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Edit"
 msgstr ""
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Color"
 msgstr ""
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Flags"
 msgstr ""
 
-#: ../src/editMode.cc:167
+#: ../src/editMode.cc:169
 msgid "Feature"
 msgstr ""
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Repair"
 msgstr ""
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Move"
 msgstr ""
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "Window"
 msgstr ""
 
-#: ../src/editMode.cc:168
+#: ../src/editMode.cc:170
 msgid "View"
 msgstr ""
 
 #. TRANSLATORS: This is a list of all the submenus in the map
 #. editor, if the initial character is * or / then that character
 #. must be perserved as it is.
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "New"
 msgstr ""
 
-#: ../src/editMode.cc:176 ../src/editWindows.cc:480
+#: ../src/editMode.cc:178 ../src/editWindows.cc:482
 msgid "Open"
 msgstr ""
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Close"
 msgstr ""
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Save"
 msgstr ""
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Exit"
 msgstr ""
 
-#: ../src/editMode.cc:176
+#: ../src/editMode.cc:178
 msgid "Test level"
 msgstr ""
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit height"
 msgstr ""
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit color"
 msgstr ""
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit water"
 msgstr ""
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit velocity"
 msgstr ""
 
-#: ../src/editMode.cc:177
+#: ../src/editMode.cc:179
 msgid "Edit lines"
 msgstr ""
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "*<SPACE> Whole cell"
 msgstr ""
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Upper corner"
 msgstr ""
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Bottom corner"
 msgstr ""
 
-#: ../src/editMode.cc:178
+#: ../src/editMode.cc:180
 msgid "Right corner"
 msgstr ""
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Left corner"
 msgstr ""
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Center"
 msgstr ""
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Raise increment"
 msgstr ""
 
-#: ../src/editMode.cc:179
+#: ../src/editMode.cc:181
 msgid "Lower increment"
 msgstr ""
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<SHIFT> reversed"
 msgstr ""
 
-#: ../src/editMode.cc:180
+#: ../src/editMode.cc:182
 msgid "*<CTRL> walls"
 msgstr ""
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. red"
 msgstr ""
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. green"
 msgstr ""
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. blue"
 msgstr ""
 
-#: ../src/editMode.cc:181
+#: ../src/editMode.cc:183
 msgid "Inc. alpha"
 msgstr ""
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Ice"
 msgstr ""
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198 ../share/levels/lv2.scm:4
+#: ../src/editMode.cc:184 ../src/editMode.cc:200 ../share/levels/lv2.scm:4
 msgid "Acid"
 msgstr ""
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:198
+#: ../src/editMode.cc:184 ../src/editMode.cc:200
 msgid "Sand"
 msgstr ""
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "Kill"
 msgstr ""
 
-#: ../src/editMode.cc:182
+#: ../src/editMode.cc:184
 msgid "Bounce"
 msgstr ""
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:199
+#: ../src/editMode.cc:184 ../src/editMode.cc:201
 msgid "No grid"
 msgstr ""
 
-#: ../src/editMode.cc:182 ../src/editMode.cc:200
+#: ../src/editMode.cc:184 ../src/editMode.cc:202
 msgid "Track"
 msgstr ""
 
-#: ../src/editMode.cc:183 ../src/editMode.cc:200
+#: ../src/editMode.cc:185 ../src/editMode.cc:202
 msgid "Shade flat"
 msgstr ""
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "Texture"
 msgstr ""
 
-#: ../src/editMode.cc:183
+#: ../src/editMode.cc:185
 msgid "ch. texture"
 msgstr ""
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Spike"
 msgstr ""
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Small hill"
 msgstr ""
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:203
+#: ../src/editMode.cc:186 ../src/editMode.cc:205
 msgid "Medium hill"
 msgstr ""
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Large hill"
 msgstr ""
 
-#: ../src/editMode.cc:184 ../src/editMode.cc:204
+#: ../src/editMode.cc:186 ../src/editMode.cc:206
 msgid "Huge hill"
 msgstr ""
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth small"
 msgstr ""
 
-#: ../src/editMode.cc:185
+#: ../src/editMode.cc:187
 msgid "Smooth large"
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Cell cont."
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Water cont."
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Color cont."
 msgstr ""
 
-#: ../src/editMode.cc:186
+#: ../src/editMode.cc:188
 msgid "Cell center"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Water center"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Color center"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Cell round"
 msgstr ""
 
-#: ../src/editMode.cc:187
+#: ../src/editMode.cc:189
 msgid "Water round"
 msgstr ""
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 msgid "Color round"
 msgstr ""
 
-#: ../src/editMode.cc:188
+#: ../src/editMode.cc:190
 msgid "Vel. round"
 msgstr ""
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/UP Move up"
 msgstr ""
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/DOWN Move down"
 msgstr ""
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/LEFT Move left"
 msgstr ""
 
-#: ../src/editMode.cc:189
+#: ../src/editMode.cc:191
 msgid "/RIGHT Move right"
 msgstr ""
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map up"
 msgstr ""
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map down"
 msgstr ""
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map left"
 msgstr ""
 
-#: ../src/editMode.cc:190
+#: ../src/editMode.cc:192
 msgid "Shift map right"
 msgstr ""
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "*<SHIFT> x5"
 msgstr ""
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Set region marker"
 msgstr ""
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Clear marker"
 msgstr ""
 
-#: ../src/editMode.cc:191
+#: ../src/editMode.cc:193
 msgid "Copy region"
 msgstr ""
 
-#: ../src/editMode.cc:192
+#: ../src/editMode.cc:194
 msgid "Paste region"
 msgstr ""
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Editor"
 msgstr ""
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Toolbar"
 msgstr ""
 
-#: ../src/editMode.cc:193
+#: ../src/editMode.cc:195
 msgid "Status"
 msgstr ""
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Birds's eye"
 msgstr ""
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Rotate view"
 msgstr ""
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Load entities"
 msgstr ""
 
-#: ../src/editMode.cc:194
+#: ../src/editMode.cc:196
 msgid "Clear entities"
 msgstr ""
 
-#: ../src/editMode.cc:199
+#: ../src/editMode.cc:201
 msgid "Trampoline"
 msgstr ""
 
-#: ../src/editMode.cc:204
+#: ../src/editMode.cc:206
 msgid "Small smooth"
 msgstr ""
 
-#: ../src/editMode.cc:205
+#: ../src/editMode.cc:207
 msgid "Large smooth"
 msgstr ""
 
-#: ../src/editMode.cc:341 ../src/mainMode.cc:178
+#: ../src/editMode.cc:343 ../src/mainMode.cc:175
 msgid "Track:"
 msgstr ""
 
-#: ../src/editMode.cc:342
+#: ../src/editMode.cc:344
 msgid "This is the default script file for this track."
 msgstr ""
 
-#: ../src/editMode.cc:344
+#: ../src/editMode.cc:346
 msgid "Read the documentation for the editor and look at the examples"
 msgstr ""
 
-#: ../src/editMode.cc:345
+#: ../src/editMode.cc:347
 msgid "to learn how to customize it"
 msgstr ""
 
-#: ../src/editMode.cc:348
+#: ../src/editMode.cc:350
 msgid "Enter your name here"
 msgstr ""
 
-#: ../src/editMode.cc:352
+#: ../src/editMode.cc:354
 msgid "Add the name of the next level here"
 msgstr ""
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell height"
 msgstr ""
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Cell water height"
 msgstr ""
 
-#: ../src/editMode.cc:499
+#: ../src/editMode.cc:498
 msgid "Textures"
 msgstr ""
 
@@ -528,71 +528,72 @@ msgstr ""
 msgid "Lines"
 msgstr ""
 
-#: ../src/editWindows.cc:302
+#: ../src/editWindows.cc:304
 msgid "spike"
 msgstr ""
 
-#: ../src/editWindows.cc:305
+#: ../src/editWindows.cc:307
 msgid "small hill"
 msgstr ""
 
-#: ../src/editWindows.cc:308
+#: ../src/editWindows.cc:310
 msgid "medium hill"
 msgstr ""
 
-#: ../src/editWindows.cc:311
+#: ../src/editWindows.cc:313
 msgid "large hill"
 msgstr ""
 
-#: ../src/editWindows.cc:314
+#: ../src/editWindows.cc:316
 msgid "huge hill"
 msgstr ""
 
-#: ../src/editWindows.cc:317
+#: ../src/editWindows.cc:319
 msgid "small smooth"
 msgstr ""
 
-#: ../src/editWindows.cc:320
+#: ../src/editWindows.cc:322
 msgid "large smooth"
 msgstr ""
 
-#: ../src/editWindows.cc:360
+#: ../src/editWindows.cc:362
 msgid "Quit without saving?"
 msgstr ""
 
-#: ../src/editWindows.cc:361 ../src/editWindows.cc:400
-#: ../src/editWindows.cc:447 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:177
-#: ../src/settingsMode.cc:179 ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:363 ../src/editWindows.cc:402
+#: ../src/editWindows.cc:449 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:180 ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:243
 msgid "Yes"
 msgstr ""
 
-#: ../src/editWindows.cc:362 ../src/editWindows.cc:401
-#: ../src/editWindows.cc:448 ../src/settingsMode.cc:130
-#: ../src/settingsMode.cc:133 ../src/settingsMode.cc:138
-#: ../src/settingsMode.cc:177 ../src/settingsMode.cc:179
-#: ../src/settingsMode.cc:189
+#: ../src/editWindows.cc:364 ../src/editWindows.cc:403
+#: ../src/editWindows.cc:450 ../src/settingsMode.cc:131
+#: ../src/settingsMode.cc:134 ../src/settingsMode.cc:139
+#: ../src/settingsMode.cc:178 ../src/settingsMode.cc:180
+#: ../src/settingsMode.cc:194 ../src/settingsMode.cc:243
 #, c-format
 msgid "No"
 msgstr ""
 
-#: ../src/editWindows.cc:399
+#: ../src/editWindows.cc:401
 msgid "Save map?"
 msgstr ""
 
-#: ../src/editWindows.cc:403
+#: ../src/editWindows.cc:405
 msgid "Saving"
 msgstr ""
 
-#: ../src/editWindows.cc:446
+#: ../src/editWindows.cc:448
 msgid "Close without saving?"
 msgstr ""
 
-#: ../src/editWindows.cc:477
+#: ../src/editWindows.cc:479
 msgid "Name of map"
 msgstr ""
 
-#: ../src/editWindows.cc:479 ../src/editWindows.cc:536
+#: ../src/editWindows.cc:481 ../src/editWindows.cc:536
 msgid "Cancel"
 msgstr ""
 
@@ -623,17 +624,17 @@ msgstr ""
 msgid "John Doe"
 msgstr ""
 
-#: ../src/glHelp.cc:1264
+#: ../src/glHelp.cc:1258
 #, c-format
 msgid "Framerate: %.1f"
 msgstr ""
 
-#: ../src/glHelp.cc:1266
+#: ../src/glHelp.cc:1260
 #, c-format
 msgid "Framerate unknown"
 msgstr ""
 
-#: ../src/glHelp.cc:1268
+#: ../src/glHelp.cc:1262
 #, c-format
 msgid "%.1f ms/Frame"
 msgstr ""
@@ -818,15 +819,10 @@ msgstr ""
 msgid "More Help"
 msgstr ""
 
-#: ../src/helpMode.cc:287 ../src/hofMode.cc:107 ../src/settingsMode.cc:242
+#: ../src/helpMode.cc:287 ../src/hofMode.cc:110 ../src/settingsMode.cc:254
 msgid "Back"
 msgstr ""
 
-#: ../src/highScore.cc:39
-#, c-format
-msgid "Anonymous Coward"
-msgstr ""
-
 #: ../src/hofMode.cc:89
 msgid "High Scores"
 msgstr ""
@@ -835,122 +831,124 @@ msgstr ""
 msgid "Level Set"
 msgstr ""
 
-#: ../src/hofMode.cc:101
+#: ../src/hofMode.cc:100
+msgid "Anonymous Coward"
+msgstr ""
+
+#: ../src/hofMode.cc:104
 #, c-format
 msgid "%d points"
 msgstr ""
 
-#: ../src/mainMode.cc:180
+#: ../src/mainMode.cc:179 ../src/setupMode.cc:227
+msgid "Unknown track"
+msgstr ""
+
+#: ../src/mainMode.cc:181
 msgid "Author:"
 msgstr ""
 
-#: ../src/mainMode.cc:182
+#: ../src/mainMode.cc:185
+msgid "Unknown author"
+msgstr ""
+
+#: ../src/mainMode.cc:187
 msgid "Press spacebar to begin"
 msgstr ""
 
-#: ../src/mainMode.cc:194 ../src/mainMode.cc:203 ../src/mainMode.cc:229
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:199 ../src/mainMode.cc:208 ../src/mainMode.cc:234
+#: ../src/mainMode.cc:248
 #, c-format
 msgid "Press spacebar to continue"
 msgstr ""
 
-#: ../src/mainMode.cc:195
+#: ../src/mainMode.cc:200
 msgid "Game over"
 msgstr ""
 
-#: ../src/mainMode.cc:203
+#: ../src/mainMode.cc:208
 msgid "Oops"
 msgstr ""
 
-#: ../src/mainMode.cc:220
+#: ../src/mainMode.cc:225
 msgid "Paused"
 msgstr ""
 
-#: ../src/mainMode.cc:229
+#: ../src/mainMode.cc:234
 msgid "Bonus level complete"
 msgstr ""
 
-#: ../src/mainMode.cc:243
+#: ../src/mainMode.cc:248
 msgid "Level complete"
 msgstr ""
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "Congratulations"
 msgstr ""
 
-#: ../src/mainMode.cc:250
+#: ../src/mainMode.cc:255
 msgid "You have completed the game!"
 msgstr ""
 
-#: ../src/mainMode.cc:542 ../src/mainMode.cc:558
+#: ../src/mainMode.cc:546 ../src/mainMode.cc:561
 msgid "Good luck!"
 msgstr ""
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Lives"
 msgstr ""
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Score"
 msgstr ""
 
-#: ../src/mainMode.cc:581
+#: ../src/mainMode.cc:584
 msgid "Time left"
 msgstr ""
 
-#: ../src/mainMode.cc:653
+#: ../src/mainMode.cc:656
 #, c-format
 msgid "Level bonuses"
 msgstr ""
 
-#: ../src/mainMode.cc:655
+#: ../src/mainMode.cc:658
 #, c-format
 msgid "Lives left:"
 msgstr ""
 
-#: ../src/mainMode.cc:656
+#: ../src/mainMode.cc:659
 #, c-format
 msgid "%d x 100 = %d points"
 msgstr ""
 
-#: ../src/mainMode.cc:657
+#: ../src/mainMode.cc:660
 #, c-format
 msgid "Time left:"
 msgstr ""
 
-#: ../src/mainMode.cc:658
+#: ../src/mainMode.cc:661
 #, c-format
 msgid "%d minutes = %d points"
 msgstr ""
 
-#: ../src/mainMode.cc:660
+#: ../src/mainMode.cc:663
 #, c-format
 msgid "Difficulty:"
 msgstr ""
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "easy"
 msgstr ""
 
-#: ../src/mainMode.cc:662 ../src/settingsMode.cc:199
+#: ../src/mainMode.cc:665 ../src/settingsMode.cc:204
 #, c-format
 msgid "normal"
 msgstr ""
 
-#: ../src/mainMode.cc:662
+#: ../src/mainMode.cc:665
 msgid "hard"
 msgstr ""
 
-#: ../src/map.cc:252
-#, c-format
-msgid "Unknown track"
-msgstr ""
-
-#: ../src/map.cc:253
-#, c-format
-msgid "Unknown author"
-msgstr ""
-
 #: ../src/menuMode.cc:70
 msgid ""
 "Trackballs is a game similar to the classical game Marble Madness from the "
@@ -986,321 +984,333 @@ msgstr ""
 msgid "Map Editor"
 msgstr ""
 
-#: ../src/mmad.cc:214
+#: ../src/mmad.cc:213
 msgid "Usage:"
 msgstr ""
 
-#: ../src/mmad.cc:215
+#: ../src/mmad.cc:214
 msgid "[-w, -m] [-e, -l -t <level>] [-r <width>] [-s <sensitivity>]"
 msgstr ""
 
-#: ../src/mmad.cc:217
+#: ../src/mmad.cc:216
 msgid "Display this usage information."
 msgstr ""
 
-#: ../src/mmad.cc:218
+#: ../src/mmad.cc:217
 msgid "Start from level."
 msgstr ""
 
-#: ../src/mmad.cc:219
+#: ../src/mmad.cc:218
 msgid "Run in window (Default is fullscreen)"
 msgstr ""
 
-#: ../src/mmad.cc:220
+#: ../src/mmad.cc:219
 msgid "Mute sound."
 msgstr ""
 
-#: ../src/mmad.cc:221
+#: ../src/mmad.cc:220
 msgid "Set resolution to 640, 800 or 1024"
 msgstr ""
 
-#: ../src/mmad.cc:222
+#: ../src/mmad.cc:221
 msgid "Mouse sensitivity, default 1.0"
 msgstr ""
 
-#: ../src/mmad.cc:223
+#: ../src/mmad.cc:222
 msgid "Displays framerate"
 msgstr ""
 
-#: ../src/mmad.cc:224
+#: ../src/mmad.cc:223
 msgid "Prints current version number"
 msgstr ""
 
-#: ../src/mmad.cc:225
+#: ../src/mmad.cc:224
 msgid "Updates a map to the latest format"
 msgstr ""
 
-#: ../src/mmad.cc:226
+#: ../src/mmad.cc:225
 msgid "Attempt to conserve memory usage"
 msgstr ""
 
-#: ../src/mmad.cc:227
+#: ../src/mmad.cc:226
 msgid "Debug joystick status"
 msgstr ""
 
-#: ../src/mmad.cc:228
+#: ../src/mmad.cc:227
 msgid "Correct for bad joysticks"
 msgstr ""
 
-#: ../src/mmad.cc:232
+#: ../src/mmad.cc:231
 msgid "Important keyboard shortcuts"
 msgstr ""
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Escape"
 msgstr ""
 
-#: ../src/mmad.cc:233
+#: ../src/mmad.cc:232
 msgid "Soft quit"
 msgstr ""
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "CapsLock"
 msgstr ""
 
-#: ../src/mmad.cc:234
+#: ../src/mmad.cc:233
 msgid "Unhide mouse pointer"
 msgstr ""
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "CTRL-q"
 msgstr ""
 
-#: ../src/mmad.cc:235
+#: ../src/mmad.cc:234
 msgid "Quit the game immediately"
 msgstr ""
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "CTRL-f"
 msgstr ""
 
-#: ../src/mmad.cc:236
+#: ../src/mmad.cc:235
 msgid "Toggle between fullscreen/windowed mode"
 msgstr ""
 
-#: ../src/mmad.cc:237
+#: ../src/mmad.cc:236
 msgid "Kill the ball"
 msgstr ""
 
-#: ../src/mmad.cc:349
+#: ../src/mmad.cc:342
 #, c-format
 msgid "Unknown screen resolution of width %d"
 msgstr ""
 
-#: ../src/mmad.cc:382
+#: ../src/mmad.cc:375
 msgid "Welcome to Trackballs."
 msgstr ""
 
-#: ../src/mmad.cc:384
+#: ../src/mmad.cc:377
 #, c-format
 msgid "Using %s as gamedata directory."
 msgstr ""
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Speed ball"
 msgstr ""
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Extra jump"
 msgstr ""
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Spikes"
 msgstr ""
 
-#: ../src/modPill.cc:123
+#: ../src/modPill.cc:105
 msgid "Glass ball"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Dizzy!"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Freeze!"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Floating"
 msgstr ""
 
-#: ../src/modPill.cc:124
+#: ../src/modPill.cc:106
 msgid "Extra life"
 msgstr ""
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Small ball"
 msgstr ""
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Large ball"
 msgstr ""
 
-#: ../src/modPill.cc:125
+#: ../src/modPill.cc:107
 msgid "Nitro"
 msgstr ""
 
-#: ../src/settingsMode.cc:84
+#: ../src/settingsMode.cc:85
 msgid "Game Settings"
 msgstr ""
 
-#: ../src/settingsMode.cc:94
+#: ../src/settingsMode.cc:95
 #, c-format
 msgid "Is resolution %dx%dx%d ok?"
 msgstr ""
 
-#: ../src/settingsMode.cc:97
+#: ../src/settingsMode.cc:98
 #, c-format
 msgid "Is resolution Auto-%d ok?"
 msgstr ""
 
-#: ../src/settingsMode.cc:101
+#: ../src/settingsMode.cc:102
 msgid "Ok, use this resolution"
 msgstr ""
 
-#: ../src/settingsMode.cc:102
+#: ../src/settingsMode.cc:103
 msgid "No, revert to old resolution"
 msgstr ""
 
-#: ../src/settingsMode.cc:104
+#: ../src/settingsMode.cc:105
 #, c-format
 msgid "Timeout in %d seconds"
 msgstr ""
 
-#: ../src/settingsMode.cc:116
+#: ../src/settingsMode.cc:117
 msgid "Video"
 msgstr ""
 
-#: ../src/settingsMode.cc:123
+#: ../src/settingsMode.cc:124
 #, c-format
 msgid "Auto-%d"
 msgstr ""
 
-#: ../src/settingsMode.cc:125
+#: ../src/settingsMode.cc:126
 msgid "Resolution"
 msgstr ""
 
-#: ../src/settingsMode.cc:126
+#: ../src/settingsMode.cc:127
 msgid "Test this resolution"
 msgstr ""
 
-#: ../src/settingsMode.cc:129
+#: ../src/settingsMode.cc:130
 msgid "Fullscreen"
 msgstr ""
 
-#: ../src/settingsMode.cc:132
+#: ../src/settingsMode.cc:133
 msgid "VSync"
 msgstr ""
 
-#: ../src/settingsMode.cc:141
+#: ../src/settingsMode.cc:142
 #, c-format
 msgid "Frame rate"
 msgstr ""
 
-#: ../src/settingsMode.cc:144
+#: ../src/settingsMode.cc:145
 #, c-format
 msgid "Frame time"
 msgstr ""
 
-#: ../src/settingsMode.cc:147
+#: ../src/settingsMode.cc:148
 msgid "Show FPS"
 msgstr ""
 
-#: ../src/settingsMode.cc:152
+#: ../src/settingsMode.cc:153
 msgid "Graphics"
 msgstr ""
 
-#: ../src/settingsMode.cc:157
+#: ../src/settingsMode.cc:158
 #, c-format
 msgid "None"
 msgstr ""
 
-#: ../src/settingsMode.cc:160
+#: ../src/settingsMode.cc:161
 #, c-format
 msgid "Minimalistic"
 msgstr ""
 
-#: ../src/settingsMode.cc:163
+#: ../src/settingsMode.cc:164
 #, c-format
 msgid "Simple"
 msgstr ""
 
-#: ../src/settingsMode.cc:166
+#: ../src/settingsMode.cc:167
 #, c-format
 msgid "Standard"
 msgstr ""
 
-#: ../src/settingsMode.cc:169
+#: ../src/settingsMode.cc:170
 #, c-format
 msgid "Extra"
 msgstr ""
 
-#: ../src/settingsMode.cc:172
+#: ../src/settingsMode.cc:173
 #, c-format
 msgid "Everything"
 msgstr ""
 
-#: ../src/settingsMode.cc:175
+#: ../src/settingsMode.cc:176
 msgid "Details"
 msgstr ""
 
-#: ../src/settingsMode.cc:176
+#: ../src/settingsMode.cc:177
 msgid "Reflections"
 msgstr ""
 
-#: ../src/settingsMode.cc:178
+#: ../src/settingsMode.cc:179
 msgid "Shadows"
 msgstr ""
 
-#: ../src/settingsMode.cc:185
+#: ../src/settingsMode.cc:183
+msgid "Shadow Resolution"
+msgstr ""
+
+#: ../src/settingsMode.cc:190
 msgid "Controls"
 msgstr ""
 
-#: ../src/settingsMode.cc:188
+#: ../src/settingsMode.cc:193
 msgid "Use mouse"
 msgstr ""
 
-#: ../src/settingsMode.cc:194
+#: ../src/settingsMode.cc:199
 msgid "Sensitivity"
 msgstr ""
 
-#: ../src/settingsMode.cc:201
+#: ../src/settingsMode.cc:206
 #, c-format
 msgid "+%d degrees"
 msgstr ""
 
-#: ../src/settingsMode.cc:203
+#: ../src/settingsMode.cc:208
 #, c-format
 msgid "-%d degrees"
 msgstr ""
 
-#: ../src/settingsMode.cc:204
+#: ../src/settingsMode.cc:209
 msgid "Steering"
 msgstr ""
 
-#: ../src/settingsMode.cc:211
+#: ../src/settingsMode.cc:216
 #, c-format
 msgid "no joystick found"
 msgstr ""
 
-#: ../src/settingsMode.cc:215
+#: ../src/settingsMode.cc:220
 msgid "Joystick:"
 msgstr ""
 
-#: ../src/settingsMode.cc:225
+#: ../src/settingsMode.cc:230
 msgid "Other"
 msgstr ""
 
-#: ../src/settingsMode.cc:229
+#: ../src/settingsMode.cc:233
+msgid "Language"
+msgstr ""
+
+#: ../src/settingsMode.cc:237
 msgid "Music volume"
 msgstr ""
 
-#: ../src/settingsMode.cc:231
+#: ../src/settingsMode.cc:239
 msgid "Effects volume"
 msgstr ""
 
-#: ../src/settingsMode.cc:233
-msgid "Language"
+#: ../src/settingsMode.cc:242
+msgid "Sandbox mode available"
+msgstr ""
+
+#: ../src/settingsMode.cc:246
+msgid "Time Compression"
 msgstr ""
 
 #: ../src/setupMode.cc:203
@@ -1319,55 +1329,55 @@ msgstr ""
 msgid "Level"
 msgstr ""
 
-#: ../src/setupMode.cc:228
+#: ../src/setupMode.cc:231
 msgid "Difficulty"
 msgstr ""
 
-#: ../src/setupMode.cc:232
+#: ../src/setupMode.cc:235
 msgid "Sandbox (Easy)"
 msgstr ""
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Normal)"
 msgstr ""
 
-#: ../src/setupMode.cc:233
+#: ../src/setupMode.cc:236
 msgid "Sandbox (Hard)"
 msgstr ""
 
-#: ../src/setupMode.cc:235
+#: ../src/setupMode.cc:238
 msgid "Easy"
 msgstr ""
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Normal"
 msgstr ""
 
-#: ../src/setupMode.cc:236
+#: ../src/setupMode.cc:239
 msgid "Hard"
 msgstr ""
 
-#: ../src/setupMode.cc:241
+#: ../src/setupMode.cc:244
 #, c-format
 msgid "Total games played: %d"
 msgstr ""
 
-#: ../src/setupMode.cc:245
+#: ../src/setupMode.cc:248
 #, c-format
 msgid "Average score: %d"
 msgstr ""
 
-#: ../src/setupMode.cc:247
+#: ../src/setupMode.cc:250
 #, c-format
 msgid "Average score: N/A"
 msgstr ""
 
-#: ../src/setupMode.cc:250
+#: ../src/setupMode.cc:253
 #, c-format
 msgid "Levels completed: %d"
 msgstr ""
 
-#: ../src/setupMode.cc:262
+#: ../src/setupMode.cc:269
 msgid "Start Game"
 msgstr ""
 
@@ -1471,6 +1481,18 @@ msgstr ""
 msgid "All made by Francek."
 msgstr ""
 
+#: ../share/levels/ds.set:1
+msgid "Don't stop"
+msgstr ""
+
+#: ../share/levels/ds.set:3 ../share/levels/ds1.scm:3
+msgid "Principia"
+msgstr ""
+
+#: ../share/levels/ds.set:4
+msgid "Or stay still and see what happens!"
+msgstr ""
+
 #: ../share/levels/elite.set:1
 msgid "Elite"
 msgstr ""
@@ -1672,15 +1694,15 @@ msgstr ""
 msgid "Four Doors"
 msgstr ""
 
-#: ../share/levels/bx2.scm:293
+#: ../share/levels/bx2.scm:304
 msgid "4 hidden switches open exit doors."
 msgstr ""
 
-#: ../share/levels/bx2.scm:295
+#: ../share/levels/bx2.scm:306
 msgid "A switch is nearby."
 msgstr ""
 
-#: ../share/levels/bx2.scm:297
+#: ../share/levels/bx2.scm:308
 msgid "Peace."
 msgstr ""
 
@@ -1688,35 +1710,35 @@ msgstr ""
 msgid "Azteca"
 msgstr ""
 
-#: ../share/levels/bx3.scm:107
+#: ../share/levels/bx3.scm:111
 msgid "You have access to the complex."
 msgstr ""
 
-#: ../share/levels/bx3.scm:125
+#: ../share/levels/bx3.scm:129
 msgid "The way is opened across the sand."
 msgstr ""
 
-#: ../share/levels/bx3.scm:135
+#: ../share/levels/bx3.scm:139
 msgid "You must enter the Arena."
 msgstr ""
 
-#: ../share/levels/bx3.scm:195 ../share/levels/bx3.scm:202
+#: ../share/levels/bx3.scm:199 ../share/levels/bx3.scm:206
 msgid "A wall has been lowered."
 msgstr ""
 
-#: ../share/levels/bx3.scm:209
+#: ../share/levels/bx3.scm:213
 msgid "A roof has been raised."
 msgstr ""
 
-#: ../share/levels/bx3.scm:225
+#: ../share/levels/bx3.scm:229
 msgid "Stairs are in place."
 msgstr ""
 
-#: ../share/levels/bx3.scm:235
+#: ../share/levels/bx3.scm:239
 msgid "You may enter upper complex."
 msgstr ""
 
-#: ../share/levels/bx3.scm:249
+#: ../share/levels/bx3.scm:252
 msgid "The exit is now open."
 msgstr ""
 
@@ -1825,6 +1847,18 @@ msgstr ""
 msgid "Final and the last"
 msgstr ""
 
+#: ../share/levels/dn6.scm:37 ../share/levels/dn6.scm:73
+msgid "Switch twice"
+msgstr ""
+
+#: ../share/levels/ds2.scm:3
+msgid "Orbit"
+msgstr ""
+
+#: ../share/levels/ds3.scm:3
+msgid "Tunnel"
+msgstr ""
+
 #: ../share/levels/elite1.scm:3
 msgid "Castle of Darius the Mede"
 msgstr ""
@@ -1969,7 +2003,7 @@ msgstr ""
 msgid "The Castle"
 msgstr ""
 
-#: ../share/levels/mhm3.scm:24
+#: ../share/levels/mhm3.scm:15
 msgid "Stay on the path or else!"
 msgstr ""
 
@@ -2041,14 +2075,14 @@ msgstr ""
 msgid "The Marble HQ"
 msgstr ""
 
-#: ../share/levels/sl6.scm:203
+#: ../share/levels/sl6.scm:199
 msgid "The Marble HQ - Do not Enter!"
 msgstr ""
 
-#: ../share/levels/sl6.scm:344
+#: ../share/levels/sl6.scm:340
 msgid "Bonus"
 msgstr ""
 
-#: ../share/levels/sl6.scm:526
+#: ../share/levels/sl6.scm:521
 msgid "Commander's Hall"
 msgstr ""
diff --git a/share/levels/bx1.scm b/share/levels/bx1.scm
index 2b1f750..777ed21 100644
--- a/share/levels/bx1.scm
+++ b/share/levels/bx1.scm
@@ -14,7 +14,7 @@
 (set-primary-color pipe1 0.1 0.1 0.1 1.0)
 (pipe-connector 114 127 1.5 0.6)
 (define pipe2 (pipe 114 127 1.5 113 127 8.6 0.5))
-(set-wind pipe2 2.8 0.0)
+(set-wind pipe2 7.8 0.0)
 (set-primary-color pipe2 0.1 0.1 0.1 1.0)
 
 (add-flag 108 131 350 #t 0.1)
@@ -36,7 +36,7 @@
 (define pipe3 (pipe 123.2 127 6.4 125 127 7.0 0.5))
 (set-wind pipe3 2.0 0.0)
 (set-primary-color pipe3 0.1 0.1 0.1 0.9)
-(pipe-connector 125 127 7.0 0.6)
+(pipe-connector 125 127 7.0 0.5)
 (define pipe4 (pipe 125 127 7.0 125 123.2 8.4 0.5))
 (set-wind pipe4 2.0 0.0)
 (set-primary-color pipe4 0.1 0.1 0.1 0.9)
diff --git a/share/levels/bx2.map b/share/levels/bx2.map
index 0cd395d..624a35a 100644
Binary files a/share/levels/bx2.map and b/share/levels/bx2.map differ
diff --git a/share/levels/bx2.scm b/share/levels/bx2.scm
index 17228c2..1565271 100644
--- a/share/levels/bx2.scm
+++ b/share/levels/bx2.scm
@@ -146,39 +146,50 @@
 
 ;;These are the guides in the city
 
-(forcefield 68.0 51.6 0.2 7.0 0.0 0.0 0.1 *ff-bounce*)
-(forcefield 67.6 52.0 -0.1 7.8 0.0 0.0 0.1 *ff-bounce*)
-(forcefield 68.0 52.4 0.2 7.0 0.0 0.0 0.1 *ff-bounce*)
-
-(forcefield 75.6 50.0 0.2 0.0 -10.0 0.0 0.1 *ff-bounce*)
-(forcefield 76.0 50.4 -0.1 0.0 -10.8 0.0 0.1 *ff-bounce*)
-(forcefield 76.4 50.0 0.2 0.0 -10.0 0.0 0.1 *ff-bounce*)
-
-(forcefield 68.0 37.6 0.2 7.0 0.0 0.0 0.1 *ff-bounce*)
-(forcefield 67.6 38.0 -0.1 7.8 0.0 0.0 0.1 *ff-bounce*)
-(forcefield 68.0 38.4 0.2 7.0 0.0 0.0 0.1 *ff-bounce*)
-
-(forcefield 65.6 37.0 0.2 0.0 -10.0 0.0 0.1 *ff-bounce*)
-(forcefield 66.0 37.4 -0.1 0.0 -10.8 0.0 0.1 *ff-bounce*)
-(forcefield 66.4 37.0 0.2 0.0 -10.0 0.0 0.1 *ff-bounce*)
-
-(forcefield 67.0 22.6 0.2 10.0 0.0 0.0 0.1 *ff-bounce*)
-(forcefield 66.6 23.0 -0.1 10.8 0.0 0.0 0.1 *ff-bounce*)
-(forcefield 67.0 23.4 0.2 10.0 0.0 0.0 0.1 *ff-bounce*)
+;; Each guide consists of one center rail and two side rails;
+;; the center rail is **ff-bounce** so we don't fall through from above
+;; the side rail forcefields only hold the ball in, not out
+(define guide-width 0.4)
+(define guide-lift 0.26)
+(define center-drop -0.05)
+(define center-extend 0.45)
+(define rail-height 0.1)
+(define ff-bridge-x
+  (lambda (x y dx)
+    (let ((s (if (> dx 0) -1 1)))
+      (forcefield x (- y guide-width) (+ center-drop guide-lift)
+                  dx 0.0 0.0
+                  rail-height (if (> dx 0) *ff-bounce2* *ff-bounce1*))
+      (forcefield (+ x (* s center-extend)) y center-drop
+                  (- dx (* s 2 center-extend)) 0.0 0.0
+                  rail-height *ff-bounce*)
+      (forcefield x (+ y guide-width) (+ center-drop guide-lift)
+                  dx 0.0 0.0
+                  rail-height (if (> dx 0) *ff-bounce1* *ff-bounce2*)))))
+(define ff-bridge-y
+  (lambda (x y dy)
+    (let ((s (if (> dy 0) -1 1)))
+      (forcefield (- x guide-width) y (+ center-drop guide-lift)
+                  0.0 dy 0.0
+                  rail-height (if (> dy 0) *ff-bounce2* *ff-bounce1*))
+      (forcefield x (+ y (* s center-extend)) center-drop
+                  0.0 (- dy (* s 2 center-extend)) 0.0
+                  rail-height *ff-bounce*)
+      (forcefield (+ x guide-width) y (+ center-drop guide-lift)
+                  0.0 dy 0.0
+                  rail-height (if (> dy 0) *ff-bounce1* *ff-bounce2*)))))
+
+(ff-bridge-x 68.0 52.0 7.0)
+(ff-bridge-y 76.0 50.0 -10.0)
+(ff-bridge-x 75.0 38.0 -7.0)
+(ff-bridge-y 66.0 27.0 10.0)
+(ff-bridge-x 67.0 23.0 10.0)
 
 ;;2nd set of guides (It is possible!)
 
-(forcefield 67.0 24.6 0.2 14.0 0.0 0.0 0.1 *ff-bounce*)
-(forcefield 66.6 25.0 -0.1 14.8 0.0 0.0 0.1 *ff-bounce*)
-(forcefield 67.0 25.4 0.2 14.0 0.0 0.0 0.1 *ff-bounce*)
-
-(forcefield 63.6 41.0 0.2 0.0 -17.0 0.0 0.1 *ff-bounce*)
-(forcefield 64.0 41.4 -0.1 0.0 -17.8 0.0 0.1 *ff-bounce*)
-(forcefield 64.4 41.0 0.2 0.0 -17.0 0.0 0.1 *ff-bounce*)
-
-(forcefield 63.6 68.0 0.2 0.0 -26.0 0.0 0.1 *ff-bounce*)
-(forcefield 64.0 68.4 -0.1 0.0 -26.8 0.0 0.1 *ff-bounce*)
-(forcefield 64.4 68.0 0.2 0.0 -26.0 0.0 0.1 *ff-bounce*)
+(ff-bridge-x 67.0 25.0 14.0)
+(ff-bridge-y 64.0 41.0 -16.5)
+(ff-bridge-y 64.0 68.0 -25.5)
 
 
 ;;PIPES GROUP 1 (from first raised area to second)
@@ -365,7 +376,6 @@
 (add-modpill 82 27 *mod-extra-life* 30 -1)
 
 
-
 ;;BEGIN LIFT SHUTE
 
 (define shute(pipe 84 24 7.5 84 23.1 15.4 0.5))
@@ -477,14 +487,12 @@
 (define pipef (pipe 81 33 2.5 81 31.2 2.5 0.5))
 (pipe-connector 81 31 2.5 0.5)
 (define pipeg (pipe 81 31 2.6 81 30 9.2 0.5))
-(set-wind pipeg 2.2 0.0)
+(set-wind pipeg 9.0 9.0)
 
 
 ;;Last set of guides (Cargo Hold).
 
-(forcefield 33.6 51.0 0.2 0.0 8.0 0.0 0.1 *ff-nothing*)
-(forcefield 34.0 50.6 -0.1 0.0 8.8 0.0 0.1 *ff-bounce*)
-(forcefield 34.4 51.0 0.2 0.0 8.0 0.0 0.1 *ff-bounce*)
+(ff-bridge-y 34.0 51.0 8.0)
 
 ;;Final door and switch.
 
diff --git a/share/levels/bx3.scm b/share/levels/bx3.scm
index efe9894..2028e25 100644
--- a/share/levels/bx3.scm
+++ b/share/levels/bx3.scm
@@ -86,12 +86,16 @@
 (define pipe1 (pipe 112.1 124.5 -3.5 122 124.5 -3.5 0.5))
 (set-primary-color pipe1 0.1 0.1 0.1 1.0)
 (pipe-connector 122 124.5 -3.5 0.6)
-(define pipe2 (pipe 122.0 124.5 -3.5 124.0 124.5 5.4 0.5))
+(define pipe2 (pipe 122.0 124.5 -3.5 124.0 124.5 2.0 0.5))
 (set-wind pipe2 8.0 0.0)
-(set-primary-color (pipe-connector 124 124.5 5.5 0.6) 0.1 0.1 0.1 1.0)
-(define pipe3 (pipe 123.9 124.5 5.6 121.2 124.5 5.1 0.5))
-(set-wind pipe3 5.5 0.0)
+(set-primary-color (pipe-connector 123.9 124.5 2.0 0.6) 0.1 0.1 0.1 1.0)
+(define pipe3 (pipe 123.9 124.5 2.0 122.9 124.5 5.4 0.5))
+(set-wind pipe3 8.0 0.0)
 (set-primary-color pipe3 0.1 0.1 0.1 1.0)
+(set-primary-color (pipe-connector 122.9 124.5 5.4 0.6) 0.1 0.1 0.1 1.0)
+(define pipe4 (pipe 122.9 124.5 5.4 121.2 124.5 5.1 0.5))
+(set-wind pipe4 5.5 0.0)
+(set-primary-color pipe4 0.1 0.1 0.1 1.0)
 
 
 
@@ -99,14 +103,14 @@
 
 (define blinker1 (add-colormodifier 3 128 124 0.5 1.0 0.5 1.0))
 (trigger-once 128 124 0.5 (lambda ()
-(set-cell-heights 122 107 130 107 -3.5 -3.5 -3.5 -3.5)
-(set-cell-heights 122 106 130 106 -3.5 -3.5 -3.5 -3.5)
-(set-cell-heights 122 106 130 103 -3.0 -3.0 -3.0 -3.0)
-(set-cell-heights 123 104 129 103 -2.5 -2.5 -2.5 -2.5)
-(set-cell-heights 124 103 128 103 -2.0 -2.0 -2.0 -2.0)
-(set-primary-color (sign (_ "You have access to the complex.") 0.8 1.0 -0.1 128 124) 0.2 0.5 1.0 1.0)
-(set-onoff blinker1 #f)
-;(set-onoff tempsign #f)
+  (set-cell-heights 122 107 130 107 -3.5 -3.5 -3.5 -3.5)
+  (set-cell-heights 122 106 130 106 -3.5 -3.5 -3.5 -3.5)
+  (set-cell-heights 122 106 130 103 -3.0 -3.0 -3.0 -3.0)
+  (set-cell-heights 123 104 129 103 -2.5 -2.5 -2.5 -2.5)
+  (set-cell-heights 124 103 128 103 -2.0 -2.0 -2.0 -2.0)
+  (set-primary-color (sign (_ "You have access to the complex.") 0.8 1.0 -0.1 128 124) 0.2 0.5 1.0 1.0)
+  (set-onoff blinker1 #f)
+  ;(set-onoff tempsign #f)
 ))
 
 
@@ -114,16 +118,16 @@
 
 (define blinker2 (add-colormodifier 3 119 54 0.5 1.0 0.5 1.0))
 (trigger-once 119 54 0.5 (lambda ()
-(set-cell-heights 87 119 101 119 -8.0 -8.0 -8.0 -8.0)
-(set-cell-heights 87 118 101 118 -8.0 -8.0 -8.0 -8.0)
-(set-cell-heights 87 117 101 117 -8.0 -8.0 -8.0 -8.0)
-(set-cell-heights 87 116 101 116 -8.0 -8.0 -8.0 -8.0)
-(set-cell-flag 87 116 101 119  *cell-sand* #f)
-(set-cell-flag 87 116 101 119  *cell-nogrid* #f)
-(set-cell-flag 79 119 86 116  *cell-acid* #t)
-(set-cell-flag 79 119 86 116  *cell-nogrid* #t)
-(set-primary-color (sign (_ "The way is opened across the sand.") 0.8 1.0 -0.1 119 54) 0.2 0.5 1.0 1.0)
-(set-onoff blinker2 #f)
+  (set-cell-heights 87 119 101 119 -8.0 -8.0 -8.0 -8.0)
+  (set-cell-heights 87 118 101 118 -8.0 -8.0 -8.0 -8.0)
+  (set-cell-heights 87 117 101 117 -8.0 -8.0 -8.0 -8.0)
+  (set-cell-heights 87 116 101 116 -8.0 -8.0 -8.0 -8.0)
+  (set-cell-flag 87 116 101 119  *cell-sand* #f)
+  (set-cell-flag 87 116 101 119  *cell-nogrid* #f)
+  (set-cell-flag 79 119 86 116  *cell-acid* #t)
+  (set-cell-flag 79 119 86 116  *cell-nogrid* #t)
+  (set-primary-color (sign (_ "The way is opened across the sand.") 0.8 1.0 -0.1 119 54) 0.2 0.5 1.0 1.0)
+  (set-onoff blinker2 #f)
 ))
 
 
@@ -131,38 +135,38 @@
 
 (define blinker3 (add-colormodifier 3 64 118 0.5 1.0 0.5 1.0))
 (trigger-once 64 118 0.5 (lambda ()
-(set-cell-heights 57 102 77 102 -7.0 -7.0 -7.0 -7.0)
-(set-primary-color (sign (_ "You must enter the Arena.") 0.8 1.0 -0.1 64 118) 0.2 0.5 1.0 1.0)
-(set-onoff blinker3 #f)
+  (set-cell-heights 57 102 77 102 -7.0 -7.0 -7.0 -7.0)
+  (set-primary-color (sign (_ "You must enter the Arena.") 0.8 1.0 -0.1 64 118) 0.2 0.5 1.0 1.0)
+  (set-onoff blinker3 #f)
 ))
 
 ;; Triggers to raise temple slide.
 
 (trigger-once 76 117 0.5 (lambda ()
-(set-cell-heights 77 116 77 116 -5.0 -5.0 -5.5 -5.5)
-(set-cell-heights 77 117 77 117 -4.5 -5.0 -5.0 -5.5)
-(set-cell-heights 77 118 77 118 -5.0 -4.5 -5.5 -5.0)
-(set-cell-heights 77 119 77 119 -5.0 -5.0 -5.5 -5.5)
-(set-cell-heights 78 116 78 116 -5.5 -5.5 -6.0 -6.0)
-(set-cell-heights 78 117 78 117 -5.0 -5.5 -5.5 -6.0)
-(set-cell-heights 78 118 78 118 -5.5 -5.0 -6.0 -5.5)
-(set-cell-heights 78 119 78 119 -5.5 -5.5 -6.0 -6.0)
-(set-cell-flag 79 119 86 116  *cell-acid* #f)
-(set-cell-flag 79 119 86 116  *cell-sand* #t)
-(set-cell-flag 79 119 86 116  *cell-nogrid* #f)
+  (set-cell-heights 77 116 77 116 -5.0 -5.0 -5.5 -5.5)
+  (set-cell-heights 77 117 77 117 -4.5 -5.0 -5.0 -5.5)
+  (set-cell-heights 77 118 77 118 -5.0 -4.5 -5.5 -5.0)
+  (set-cell-heights 77 119 77 119 -5.0 -5.0 -5.5 -5.5)
+  (set-cell-heights 78 116 78 116 -5.5 -5.5 -6.0 -6.0)
+  (set-cell-heights 78 117 78 117 -5.0 -5.5 -5.5 -6.0)
+  (set-cell-heights 78 118 78 118 -5.5 -5.0 -6.0 -5.5)
+  (set-cell-heights 78 119 78 119 -5.5 -5.5 -6.0 -6.0)
+  (set-cell-flag 79 119 86 116  *cell-acid* #f)
+  (set-cell-flag 79 119 86 116  *cell-sand* #t)
+  (set-cell-flag 79 119 86 116  *cell-nogrid* #f)
 ))
 (trigger-once 76 118 0.5 (lambda ()
-(set-cell-heights 77 116 77 116 -5.0 -5.0 -5.5 -5.5)
-(set-cell-heights 77 117 77 117 -4.5 -5.0 -5.0 -5.5)
-(set-cell-heights 77 118 77 118 -5.0 -4.5 -5.5 -5.0)
-(set-cell-heights 77 119 77 119 -5.0 -5.0 -5.5 -5.5)
-(set-cell-heights 78 116 78 116 -5.5 -5.5 -6.0 -6.0)
-(set-cell-heights 78 117 78 117 -5.0 -5.5 -5.5 -6.0)
-(set-cell-heights 78 118 78 118 -5.5 -5.0 -6.0 -5.5)
-(set-cell-heights 78 119 78 119 -5.5 -5.5 -6.0 -6.0)
-(set-cell-flag 79 119 86 116  *cell-acid* #f)
-(set-cell-flag 79 119 86 116  *cell-sand* #t)
-(set-cell-flag 79 119 86 116  *cell-nogrid* #f)
+  (set-cell-heights 77 116 77 116 -5.0 -5.0 -5.5 -5.5)
+  (set-cell-heights 77 117 77 117 -4.5 -5.0 -5.0 -5.5)
+  (set-cell-heights 77 118 77 118 -5.0 -4.5 -5.5 -5.0)
+  (set-cell-heights 77 119 77 119 -5.0 -5.0 -5.5 -5.5)
+  (set-cell-heights 78 116 78 116 -5.5 -5.5 -6.0 -6.0)
+  (set-cell-heights 78 117 78 117 -5.0 -5.5 -5.5 -6.0)
+  (set-cell-heights 78 118 78 118 -5.5 -5.0 -6.0 -5.5)
+  (set-cell-heights 78 119 78 119 -5.5 -5.5 -6.0 -6.0)
+  (set-cell-flag 79 119 86 116  *cell-acid* #f)
+  (set-cell-flag 79 119 86 116  *cell-sand* #t)
+  (set-cell-flag 79 119 86 116  *cell-nogrid* #f)
 ))
 
 
@@ -191,53 +195,52 @@
 
 (define blinker4 (add-colormodifier 3 103 73 0.5 1.0 0.5 1.0))
 (trigger-once 103 73 0.5 (lambda ()
-(set-cell-heights 103 61 104 53 -3.5 -3.5 -3.5 -3.5)
-(set-primary-color (sign (_ "A wall has been lowered.") 0.8 1.0 -0.1 103 73) 0.2 0.5 1.0 1.0)
-(set-onoff blinker4 #f)
+  (set-cell-heights 103 61 104 53 -3.5 -3.5 -3.5 -3.5)
+  (set-primary-color (sign (_ "A wall has been lowered.") 0.8 1.0 -0.1 103 73) 0.2 0.5 1.0 1.0)
+  (set-onoff blinker4 #f)
 ))
 
 (define blinker5 (add-colormodifier 3 103 92 0.5 1.0 0.5 1.0))
 (trigger-once 103 92 0.5 (lambda ()
-(set-cell-heights 115 93 116 91 -1.5 -1.5 -1.5 -1.5)
-(set-primary-color (sign (_ "A wall has been lowered.") 0.8 1.0 -0.1 103 92) 0.2 0.5 1.0 1.0)
-(set-onoff blinker5 #f)
+  (set-cell-heights 115 93 116 91 -1.5 -1.5 -1.5 -1.5)
+  (set-primary-color (sign (_ "A wall has been lowered.") 0.8 1.0 -0.1 103 92) 0.2 0.5 1.0 1.0)
+  (set-onoff blinker5 #f)
 ))
 
 (define blinker6 (add-colormodifier 3 83 73 0.5 1.0 0.5 1.0))
 (trigger-once 83 73 0.5 (lambda ()
-(set-cell-heights 66 80 72 66 -0.5 -0.5 -0.5 -0.5)
-(set-primary-color (sign (_ "A roof has been raised.") 0.8 1.0 -0.1 83 73) 0.2 0.5 1.0 1.0)
-(set-onoff blinker6 #f)
+  (set-cell-heights 66 80 72 66 -0.5 -0.5 -0.5 -0.5)
+  (set-primary-color (sign (_ "A roof has been raised.") 0.8 1.0 -0.1 83 73) 0.2 0.5 1.0 1.0)
+  (set-onoff blinker6 #f)
 ))
 
 (define blinker7 (add-colormodifier 3 83 92 0.5 1.0 0.5 1.0))
 (trigger-once 83 92 0.5 (lambda ()
-(set-cell-heights 76 146 86 146 -9.0 -9.0 -9.0 -9.0)
-(set-cell-heights 76 147 86 147 -8.5 -8.5 -8.5 -8.5)
-(set-cell-heights 76 148 86 148 -8.0 -8.0 -8.0 -8.0)
-(set-cell-heights 76 149 86 149 -7.5 -7.5 -7.5 -7.5)
-(set-cell-heights 76 150 86 150 -7.0 -7.0 -7.0 -7.0)
-(set-cell-heights 76 151 86 151 -6.5 -6.5 -6.5 -6.5)
-(set-cell-heights 80 152 80 154 -4.5 -4.5 -4.5 -4.5)
-(set-cell-heights 81 152 81 154 -5.0 -5.0 -5.0 -5.0)
-(set-cell-heights 82 152 82 154 -5.5 -5.5 -5.5 -5.5)
-(set-cell-heights 83 152 86 154 -6.0 -6.0 -6.0 -6.0)
-(set-primary-color (sign (_ "Stairs are in place.") 0.8 1.0 -0.1 83 92) 0.2 0.5 1.0 1.0)
-(set-onoff blinker7 #f)
+  (set-cell-heights 76 146 86 146 -9.0 -9.0 -9.0 -9.0)
+  (set-cell-heights 76 147 86 147 -8.5 -8.5 -8.5 -8.5)
+  (set-cell-heights 76 148 86 148 -8.0 -8.0 -8.0 -8.0)
+  (set-cell-heights 76 149 86 149 -7.5 -7.5 -7.5 -7.5)
+  (set-cell-heights 76 150 86 150 -7.0 -7.0 -7.0 -7.0)
+  (set-cell-heights 76 151 86 151 -6.5 -6.5 -6.5 -6.5)
+  (set-cell-heights 80 152 80 154 -4.5 -4.5 -4.5 -4.5)
+  (set-cell-heights 81 152 81 154 -5.0 -5.0 -5.0 -5.0)
+  (set-cell-heights 82 152 82 154 -5.5 -5.5 -5.5 -5.5)
+  (set-cell-heights 83 152 86 154 -6.0 -6.0 -6.0 -6.0)
+  (set-primary-color (sign (_ "Stairs are in place.") 0.8 1.0 -0.1 83 92) 0.2 0.5 1.0 1.0)
+  (set-onoff blinker7 #f)
 ))
 
 (define blinker8 (add-colormodifier 3 75 162 0.5 1.0 0.5 1.0))
 (trigger-once 75 162 0.5 (lambda ()
-(set-cell-heights 59 53 66 53 -4.0 -4.0 -4.0 -4.0)
-(set-cell-heights 59 52 66 52 -3.5 -3.5 -3.5 -3.5)
-(set-cell-heights 59 51 66 51 -3.0 -3.0 -3.0 -3.0)
+  (set-cell-heights 59 53 66 53 -4.0 -4.0 -4.0 -4.0)
+  (set-cell-heights 59 52 66 52 -3.5 -3.5 -3.5 -3.5)
+  (set-cell-heights 59 51 66 51 -3.0 -3.0 -3.0 -3.0)
 
-(set-primary-color (sign (_ "You may enter upper complex.") 0.8 1.0 -0.1 75 162) 0.2 0.5 1.0 1.0)
-(set-onoff blinker8 #f)
+  (set-primary-color (sign (_ "You may enter upper complex.") 0.8 1.0 -0.1 75 162) 0.2 0.5 1.0 1.0)
+  (set-onoff blinker8 #f)
 ))
 
-(define pipe4 (pipe 95 166 -2.5 99 166 -2.5 1.5))
-(set-primary-color pipe4 0.1 0.1 0.1 1.0)
+(set-primary-color (pipe 95 166 -2.5 99 166 -2.5 1.5) 0.1 0.1 0.1 1.0)
 
 (add-teleport 133 151 122 71 0.3)
 
@@ -245,9 +248,9 @@
 
 (define blinker9 (add-colormodifier 3 53 101 0.5 1.0 0.5 1.0))
 (trigger-once 53 101 0.5 (lambda ()
-(set-cell-heights 119 77 125 77 4.0 4.0 4.0 4.0)
-(set-primary-color (sign (_ "The exit is now open.") 0.8 1.0 -0.1 53 101) 0.2 0.5 1.0 1.0)
-(set-onoff blinker9 #f)
+  (set-cell-heights 119 77 125 77 4.0 4.0 4.0 4.0)
+  (set-primary-color (sign (_ "The exit is now open.") 0.8 1.0 -0.1 53 101) 0.2 0.5 1.0 1.0)
+  (set-onoff blinker9 #f)
 ))
 
 
diff --git a/share/levels/con2.scm b/share/levels/con2.scm
index b21f222..b4da06b 100644
--- a/share/levels/con2.scm
+++ b/share/levels/con2.scm
@@ -16,13 +16,10 @@
 
 (add-modpill 236 250 *mod-spike* 25 40)
 
-(define mr-black (new-mr-black 223.5 239.5))
+(define mr-black (new-mr-black 224 240))
 (if (= (difficulty) *hard*) (set-modtime mr-black *mod-spike* -1.))
 (set-acceleration mr-black 2.0)
 
-
-(define speed 0.2)
-
 ;;; modpill-types:
 ;;; *mod-speed* - "Speedball": Makes the player go faster
 ;;; *mod-jump* - "Jumpjets": Makes the player jump higher
diff --git a/share/levels/con4.map b/share/levels/con4.map
index 34a5bc6..91e37ba 100644
Binary files a/share/levels/con4.map and b/share/levels/con4.map differ
diff --git a/share/levels/con4.scm b/share/levels/con4.scm
index 99a5bee..3066c50 100644
--- a/share/levels/con4.scm
+++ b/share/levels/con4.scm
@@ -26,7 +26,7 @@
 (add-flag 246 224 100 #t 0.1)
 
 ;;; spikes and save point for last stetch
-(trigger 251.5 242.5 0.5 (lambda () (set-start-position 252.5 243.5)))
+(trigger 251.5 242.5 0.5 (lambda () (set-start-position 251.5 243.5)))
 (add-modpill 251.5 242.5 *mod-spike* 25 40)
 
 
diff --git a/share/levels/dn6.scm b/share/levels/dn6.scm
index 5dd60bf..9521ab3 100644
--- a/share/levels/dn6.scm
+++ b/share/levels/dn6.scm
@@ -34,7 +34,7 @@
 (define b4 (new-mr-black 208.5 176.5))
 (set-horizon b4 2.5)
 
-(sign "Switch twice" 1.0 0.0 0.0 218 156)
+(sign (_ "Switch twice") 1.0 0.0 0.0 218 156)
 
 (if (= (difficulty) *hard*)
     (new-mr-black 199.5 200.5))
@@ -70,7 +70,7 @@
         (lambda () (if invisible (begin (set! invisible #f) (add-goal 201 201 #t ""))))
         (lambda () (new-mr-black 201 200)))
 
-(sign "Switch twice" 1.0 0.0 0.0 194 172)
+(sign (_ "Switch twice") 1.0 0.0 0.0 194 172)
 
 
 (add-flag 208 177 200 #t 0.1)
diff --git a/share/levels/ds.jpg b/share/levels/ds.jpg
new file mode 100644
index 0000000..13c8a52
Binary files /dev/null and b/share/levels/ds.jpg differ
diff --git a/share/levels/ds.set b/share/levels/ds.set
new file mode 100644
index 0000000..226dffd
--- /dev/null
+++ b/share/levels/ds.set
@@ -0,0 +1,4 @@
+(name (_ "Don't stop"))
+(first-level-file "ds1")
+(first-level-name (_ "Principia"))
+(desc1 (_ "Or stay still and see what happens!"))
diff --git a/share/levels/frg7.map b/share/levels/ds1.map
similarity index 92%
copy from share/levels/frg7.map
copy to share/levels/ds1.map
index 905e1ac..52b1f60 100644
Binary files a/share/levels/frg7.map and b/share/levels/ds1.map differ
diff --git a/share/levels/ds1.scm b/share/levels/ds1.scm
new file mode 100644
index 0000000..e167246
--- /dev/null
+++ b/share/levels/ds1.scm
@@ -0,0 +1,46 @@
+;;; Track: ds1
+
+(set-track-name (_ "Principia"))
+(set-author "0x7fa00000")
+(start-time 180)
+(load "ds_lib.scm")
+(set-start-position 220 220)
+(add-goal 220 223 #t "ds2")
+(add-flag 248 250 50 #t 0.1)
+
+(define ff (forcefield 219 222.5 0 0.0 1.0 0.0 1.0 *ff-bounce*))
+
+(define roger #f)
+
+(define witch (switch 223 212
+  (lambda () (set-onoff ff #t))
+  (lambda () (set-onoff ff #f))))
+
+(set-primary-color ff 0. 0. 1. 1.0)
+(set-primary-color witch 0. 0. 1. 1.0)
+
+(smart-trigger 224.5 224.5 3.
+  (lambda ()
+    (set-horizon roger 10.))
+  (lambda () #f))
+
+(define reset
+  (lambda ()
+    (if (boolean? roger)
+         (begin (set! roger (new-mr-black 224.6 224.6))
+            (on-event *death* roger (lambda (sub obj) (set! roger #f))))
+         (set-position roger 224.6 224.6 0.25))
+    (cond ((eq? (difficulty) *easy*) (set-modtime roger *mod-small* -1.))
+          ((eq? (difficulty) *normal*) #f)
+          ((eq? (difficulty) *hard*) (set-modtime roger *mod-spike* -1.)))
+    (set-acceleration roger 4.0)
+    (set-horizon roger 2.0)
+    (set-primary-color roger 0.5 0. 0. 1.0)
+    (set-secondary-color roger 1. 0. 0. 1.0)
+
+    (add-flag 219 226 50 #t 0.1)
+    (add-flag 216 220 100 #t 0.1)
+    (add-flag 220 209 200 #t 0.1)
+
+    (set-onoff ff #t)
+    (set-onoff witch #t)))
diff --git a/share/levels/fourSeasons_4.map b/share/levels/ds2.map
similarity index 90%
copy from share/levels/fourSeasons_4.map
copy to share/levels/ds2.map
index e2a6737..eb62944 100644
Binary files a/share/levels/fourSeasons_4.map and b/share/levels/ds2.map differ
diff --git a/share/levels/ds2.scm b/share/levels/ds2.scm
new file mode 100644
index 0000000..7f1b755
--- /dev/null
+++ b/share/levels/ds2.scm
@@ -0,0 +1,67 @@
+;;; Track ds2
+
+(set-track-name (_ "Orbit"))
+(set-author "0x7fa00000")
+(start-time 200)
+(set-start-position 223 223)
+(load "ds_lib.scm")
+
+(night)
+
+(add-goal 221 195.3 #f "ds3")
+(add-goal 220 195.3 #f "ds3")
+
+(set-primary-color (add-flag 223 213 1000 #t 0.1) 0.0 0.0 0.0 1.0)
+
+(define pitball #f)
+
+(define reset
+  (lambda ()
+    (if (boolean? pitball)
+        (begin
+          (set! pitball (new-mr-black 223 213))
+          (on-event *death* pitball (lambda (sub obj) (set! pitball #f)))))
+    (set-position pitball 223 213 -3.0)
+    (set-modtime pitball *mod-spike* -1.)
+    (if (not (eq? (difficulty) *easy*))
+        (set-modtime pitball *mod-large* -1.))
+    (if (not (eq? (difficulty) *hard*))
+        (begin 
+          (set-acceleration pitball 5.0)
+          (set-horizon pitball 5.0))
+        (begin 
+          (set-acceleration pitball 10.0)
+          (set-horizon pitball 8.0)))
+    (set-primary-color pitball 1.0 0. 0. 1.0)
+    (set-secondary-color pitball 1. 1. 1. 1.0)
+         
+    (night)
+    (set-cell-heights 220 192 221 192 5.5 5.5 5.5 5.5)
+    (set-onoff green-gate (not (eq? (difficulty) *easy*)))
+    (set-onoff blue-gate (eq? (difficulty) *hard*))
+    (set-onoff green-switch (not (eq? (difficulty) *easy*)))
+    (set-onoff blue-switch (eq? (difficulty) *hard*))))
+
+(define green-gate (forcefield 222 204 -2 2.0 0.0 0.0 3.0 *ff-bounce*))
+(define blue-gate (forcefield 222 203  -2 2.0 0.0 0.0 3.0 *ff-bounce*))
+
+(define rev (switch 218 194
+  (lambda () #f)
+  (lambda () (set-cell-heights 220 192 221 192 4 4 4 4))))
+
+(define green-switch (switch 229 213
+  (lambda () (set-onoff green-gate #t))
+  (lambda () (set-onoff green-gate #f))))
+
+(define blue-switch (switch 217 213
+  (lambda () (set-onoff blue-gate #t))
+  (lambda () (set-onoff blue-gate #f))))
+
+(set-primary-color green-switch 0 1 0. 1.0)
+(set-primary-color green-gate 0.0 1 0. 1.0)
+(set-primary-color blue-switch 0 0. 1. 1.0)
+(set-primary-color blue-gate 0 0. 1. 1.0)
+
+(add-flag 211 183 50 #t 0.2)
+(add-flag 222 183 50 #t 0.2)
+(add-flag 211 194 50 #t 0.2)
diff --git a/share/levels/frg8.map b/share/levels/ds3.map
similarity index 80%
copy from share/levels/frg8.map
copy to share/levels/ds3.map
index d8f1e2f..ec5a978 100644
Binary files a/share/levels/frg8.map and b/share/levels/ds3.map differ
diff --git a/share/levels/ds3.scm b/share/levels/ds3.scm
new file mode 100644
index 0000000..f57240f
--- /dev/null
+++ b/share/levels/ds3.scm
@@ -0,0 +1,111 @@
+;;; Track ds3
+
+(set-track-name (_ "Tunnel"))
+(set-author "0x7fa00000")
+(start-time 180)
+(load "ds_lib.scm")
+
+(fog)
+(fog-color 0. 0. 0.)
+
+(set-start-position 239 250.3)
+
+(add-goal 250 169.3 #f "")
+(add-flag 248 250 50 #t 0.1)
+
+(define respawn-list '())
+
+(define add-respawning
+  (lambda (x y func)
+    (let ((elem #f))
+      (set! respawn-list (cons
+        (lambda () (if (eq? elem #f)
+                      (let ((next (func x y)))
+                        (on-event *death* next (lambda (sub obj) (set! elem #f)))
+                        (set! elem next))
+                      (set-position elem x y)))
+        respawn-list)))))
+
+(define make-mini (lambda (x y)
+  (set-modtime (set-modtime (new-mr-black x y) *mod-spike* -1.) *mod-small* -1)))
+(define make-cactus (lambda (x y) (add-cactus x y 0.5)))
+
+(add-respawning 238.5 240 make-mini)
+(add-respawning 237.5 240 make-mini)
+(add-respawning 239.5 240 make-mini)
+(add-respawning 237.5 236 make-mini)
+
+(jump 0.3)
+
+
+(add-respawning 240 236 make-cactus)
+
+;; passageway
+(pipe 241 213 -4.2 247 213 -4.2 0.6)
+(pipe 241 217 -4.2 247 217 -4.2 0.6)
+
+(add-modpill 239 213 *mod-small* 10 2)
+(add-modpill 239 208 *mod-small* 5 2)
+
+(cond ((eq? (difficulty) *easy*)
+        (add-respawning 239.5 207
+          (lambda (x y)
+            (set-modtime (new-mr-black x y) *mod-spike* -1.))))
+      ((eq? (difficulty) *normal*)
+        (add-respawning 239.5 207
+          (lambda (x y)
+            (set-modtime (set-modtime (new-mr-black x y) *mod-spike* -1.) *mod-large* -1))))
+      ((eq? (difficulty) *hard*)
+        (add-respawning 238.5 207
+          (lambda (x y)
+            (set-acceleration (set-primary-color (set-modtime (new-mr-black x y) *mod-spike* -1.) 1. 0. 1. 1.0) 10)))))
+
+;; Height gates
+(pipe 242 209 -4.0 236 209 -4.0 0.1)
+(pipe 242 209.2 -4.0 236 209.2 -4.0 0.1)
+(pipe 242 204 -4.0 236 204 -4.0 0.1)
+(pipe 242 204.2 -4.0 236 204.2 -4.0 0.1)
+
+(add-bird 241 171 241 187 0.4 1.5)
+(add-bird 239 171 239 187 0.4 1.5)
+(add-bird 237 171 237 187 0.4 1.5)
+
+
+;; x y speed phase
+(add-sidespike 241 200 0.3 0.5 2)
+(add-sidespike 237 200 0.3 0.5 1)
+(add-spike 241 195 0.3 0.1)
+(add-spike 240 195 0.3 0.2)
+(add-spike 239 195 0.3 0.3)
+(add-spike 238 195 0.3 0.4)
+(add-spike 237 195 0.3 0.5)
+
+(add-spike 239.5 187 2.0 0.5)
+(add-spike 239 187 2.0 0.5)
+(add-spike 238.5 187 2.0 0.5)
+
+(add-sidespike 241 186 0.6 0.0 2)
+(add-sidespike 237 186 0.6 0.0 1)
+(add-sidespike 241 185 0.6 0.5 2)
+(add-sidespike 237 185 0.6 0.5 1)
+
+(add-spike 240 174 1.0 0.5)
+(add-spike 238 174 1.0 0.5)
+
+(add-flag 251 167 50 #t 0.1)
+(add-flag 250 167 50 #t 0.1)
+(add-flag 249 167 50 #t 0.1)
+(add-flag 251 211 50 #t 0.1)
+
+(add-flag 238 237 50 #t 0.1)
+(set-primary-color (add-flag 237 216 50 #t 0.1) 1.0 1.0 0.0 1.0)
+
+(add-flag 239 174 50 #t 0.1)
+(add-flag 241 174 50 #t 0.1)
+(add-flag 237 174 50 #t 0.1)
+
+(add-flag 239 189 50 #t 0.1)
+
+(define reset
+  (lambda ()
+    (map (lambda (f) (f)) respawn-list)))
diff --git a/share/levels/ds_lib.scm b/share/levels/ds_lib.scm
new file mode 100644
index 0000000..6e8c7bf
--- /dev/null
+++ b/share/levels/ds_lib.scm
@@ -0,0 +1,73 @@
+;;
+;; Library of common routines and settings for the ds class levels
+;;
+
+(restart-time 0)
+
+(define speed 
+  (cond ((eq? (difficulty) *easy*) 0.1)
+        ((eq? (difficulty) *normal*) 0.2)
+        ((eq? (difficulty) *hard*) 0.3)))
+
+(define make-pipe-link
+  (lambda (x1 y1 x2 y2 z)
+    (let* ((rx (- y1 y2))
+           (ry (- x2 x1))
+           (nrm (* 4 (sqrt (+ (* rx rx) (* ry ry)))))
+           (dx (/ rx nrm))
+           (dy (/ ry nrm)))
+    (pipe (+ x1 dx) (+ y1 dy) (- z 0.1) (+ x2 dx) (+ y2 dy) (- z 0.1) 0.1)
+    (pipe (- x1 dx) (- y1 dy) (- z 0.1) (- x2 dx) (- y2 dy) (- z 0.1) 0.1))))
+
+(define marked (make-list (* 128 256) #f))
+
+(define main-loop
+  (lambda ()
+    (let ((rx (get-position-x (player)))
+          (ry (get-position-y (player))))
+      (let* ((cx (inexact->exact (round rx)))
+             (cy (inexact->exact (round ry)))
+             (loc (+ (* 256 (- cx 128)) cy))
+             (cur (if (and (>= loc 0) (< loc (* 128 256))) (list-ref marked loc) #f)))
+        (cond ((or (< loc 0) (>= loc (* 128 256))
+                   (not (boolean? cur))
+                   (get-cell-flag cx cy *cell-kill*))
+               #f)
+              (cur #f)
+              (else
+                (list-set! marked loc (animator 1.0 0.1 speed 0.0 1.0 *animator-remove*
+                    (lambda (j)
+                      (cond ((> j 0.7)
+                              (set-cell-colors cx cy cx cy *cell-center* 1 0 0 1)
+                              (set-cell-flag cx cy cx cy *cell-kill* #t)
+                              (let ((f (list-ref marked loc)))
+                                (if (not (boolean? f))
+                                    (begin (set-animator-position f 1.)
+                                           (set-animator-direction f 1.))))
+                              (list-set! marked loc #t))
+                            ((< j 0.05) (list-set! marked loc #f))
+                            (else (set-cell-colors cx cy cx cy
+                              *cell-center* 1.0 (- 1 j) (- 1 j) 1.0))))))))))))
+
+(animator 0.0 0.1 0.05 0.0 1.0 *animator-wrap*
+  (lambda (h) (main-loop)))
+
+;; req player existance in case of edit mode
+(if (not (unspecified? (player)))
+  (on-event *spawn* (player)
+    (lambda (sub obj)
+      (map
+        (lambda (e)
+          (if (boolean? e) #f
+            (begin
+              (set-animator-position e -1.)
+              (set-animator-direction e -1.)
+              #f)))
+        marked)
+      (set! marked (make-list (* 128 256) #f))
+      (copy-cells 0 0 127 255 128 0 #f #f #f)
+      (reset))))
+
+(define reset (lambda x (error "Users of 'ds_lib' must override the function (reset)" #f)))
+
+(copy-cells 128 0 255 255 0 0 #f #f #f)
diff --git a/share/levels/fourSeasons_4.map b/share/levels/fourSeasons_4.map
index e2a6737..60675c2 100644
Binary files a/share/levels/fourSeasons_4.map and b/share/levels/fourSeasons_4.map differ
diff --git a/share/levels/frg7.map b/share/levels/frg7.map
index 905e1ac..2a639fe 100644
Binary files a/share/levels/frg7.map and b/share/levels/frg7.map differ
diff --git a/share/levels/frg8.map b/share/levels/frg8.map
index d8f1e2f..28cde41 100644
Binary files a/share/levels/frg8.map and b/share/levels/frg8.map differ
diff --git a/share/levels/ki1.scm b/share/levels/ki1.scm
index b9ccbd4..309f47b 100644
--- a/share/levels/ki1.scm
+++ b/share/levels/ki1.scm
@@ -18,11 +18,3 @@
 (add-flag 247 235 250 #t 0.5)
 (add-flag 228 237 100 #t 0.1)
 
-(define speed 0.2)
-;(cond
-; ((= (difficulty) *easy*) (set! speed 0.10))
-; ((= (difficulty) *normal*) (set! speed 0.20))
-; ((= (difficulty) *hard*) (set! speed 0.30))
-;)
-
-
diff --git a/share/levels/ki2.scm b/share/levels/ki2.scm
index 1368755..48c60b3 100644
--- a/share/levels/ki2.scm
+++ b/share/levels/ki2.scm
@@ -19,11 +19,4 @@
 (add-flag 249 241 100 #t 0.1)
 
 
-(define speed 0.2)
-;(cond
-; ((= (difficulty) *easy*) (set! speed 0.10))
-; ((= (difficulty) *normal*) (set! speed 0.20))
-; ((= (difficulty) *hard*) (set! speed 0.30))
-;)
-
 
diff --git a/share/levels/ki3.scm b/share/levels/ki3.scm
index bcc6269..de69ca6 100644
--- a/share/levels/ki3.scm
+++ b/share/levels/ki3.scm
@@ -17,7 +17,5 @@
 (add-flag 234 235 100 #t 0.1)
 (add-flag 239 252 100 #t 0.1)
 
-(define speed 0.2)
-
 (add-modpill 230.5 241.5 *mod-spike* 25 40)
 (add-modpill 241.5 232.5 *mod-spike* 25 40)
diff --git a/share/levels/ki5.scm b/share/levels/ki5.scm
index 6e936fc..bbab9f5 100644
--- a/share/levels/ki5.scm
+++ b/share/levels/ki5.scm
@@ -28,5 +28,3 @@
 (add-flag 218 236 500 #t 0.1)
 (add-flag 218 248 500 #t 0.1)
 
-(define speed 0.2)
-
diff --git a/share/levels/lv6.scm b/share/levels/lv6.scm
index 7eaac23..7d504ef 100644
--- a/share/levels/lv6.scm
+++ b/share/levels/lv6.scm
@@ -23,8 +23,8 @@
 (define ff0 (forcefield 236.5 245.5 0.0 0.0 1.0 0.0 0.8 *ff-bounce*))
 (set-wind (pipe 223 250 -2.5 219 250 0.0 0.5) 3.0 1.0)
 
-(diamond 217.5 250.5)
-(switch 211.5 245.5 
+(diamond 217.0 250.0)
+(switch 211.0 245.0 
     (lambda() (set-onoff ff0 #t)) 
     (lambda()(set-onoff ff0 #f)))
 
diff --git a/share/levels/lv9.scm b/share/levels/lv9.scm
index 05a1488..7509ff5 100644
--- a/share/levels/lv9.scm
+++ b/share/levels/lv9.scm
@@ -22,7 +22,7 @@
 (define mb0 (new-mr-black 198 191))
 (if (= (difficulty) *hard*) (set-modtime mb0 *mod-spike* -1.))
 
-(define waterAnimator (animator 1.0 0.0 0.0 -4.2 -3.1 *animator-stop* (lambda (v) (set-cell-water-heights 191 188 201 194 v v v v))))
+(define waterAnimator (animator 1.0 0.0 0.0 -4.2 -3.1 *animator-stop* (lambda (v) (set-cell-water-heights 191 188 201 194 v v v v) (set-cell-water-heights 190 189 190 193 v v v v))))
 (switch 192 193 (lambda () (set-animator-direction waterAnimator -0.2)) (lambda () (set-animator-direction waterAnimator 0.2)))
 
 (add-modpill 199 189 *mod-float* (- 30 (* 8 (difficulty))) 45)
diff --git a/share/levels/mhm2.scm b/share/levels/mhm2.scm
index f6ea3ac..e1e1429 100644
--- a/share/levels/mhm2.scm
+++ b/share/levels/mhm2.scm
@@ -9,18 +9,6 @@
 
 (day)
 
-
-
-
-;;Set ball velocity.
-
-(define speed 0.3)
-(cond
- ((= (difficulty) *easy*) (set! speed 0.20))
- ((= (difficulty) *normal*) (set! speed 0.30))
- ((= (difficulty) *hard*) (set! speed 0.40)))
-
-
 ;;pipe rails...
 
 (pipe-connector 238 249 3.3 0.1)
@@ -72,26 +60,12 @@
 
 ;;Pipes to get back to top of level.
 
-
-;(multi-pipe
-;'((219.5 226.0 -2.2)(219.5 225.0 -2.2)
-;  (219.5 224.0 -7.2)(219.5 222.0 -7.2)) 0.5 #t)
-
-(define pipe1(pipe 219 225.5 -2.2 219. 224.5 -2.2 0.5))
-(set-primary-color pipe1 0.0 0.0 0.0 1.0)
-;(set-wind pipe1 0.0 0.0)
-
-(set-primary-color (pipe-connector 219. 224.5 -2.2 0.5) 0.0 0.0 0.0 1.0)
-
-(define pipe2(pipe 219. 224.5 -2.2 219. 223.5 -7.2 0.5))
-(set-primary-color pipe2 0.0 0.0 0.0 1.0)
-(set-wind pipe2 -12.0 -6.0)
-
-(set-primary-color (pipe-connector 219. 223.5 -7.2 0.5) 0.0 0.0 0.0 1.0)
-
-(define pipe3(pipe 219. 223.5 -7.2 219.0 221.5 -7.2 0.5))
-(set-primary-color pipe3 0.0 0.0 0.0 1.0)
-(set-wind pipe3 -12.0 -6.0)
+(map (lambda (p)
+       (set-primary-color p 0.01 0.01 0.01 1.0)
+       (set-wind p 9.0 30.0))
+  (multi-pipe
+    '((219 222.0 -7.2) (219 223.0 -7.2) (219 224.5 -3.0)
+      (219 225.5 -2.2) (219 226.5 -2.2)) 0.5 #t))
 
 
 ;forcefield & switch.
diff --git a/share/levels/mhm3.scm b/share/levels/mhm3.scm
index 056c8db..87c3f09 100644
--- a/share/levels/mhm3.scm
+++ b/share/levels/mhm3.scm
@@ -10,15 +10,6 @@
 (day)
 
 
-;;Set ball velocity.
-
-(define speed 0.3)
-(cond
- ((= (difficulty) *easy*) (set! speed 0.20))
- ((= (difficulty) *normal*) (set! speed 0.30))
- ((= (difficulty) *hard*) (set! speed 0.40)))
-
-
 ;Warning sign.
 
 (set-primary-color (sign (_ "Stay on the path or else!") 2.0 -0.1 4.0 113.0 172.0 -3.5) 0.9 0.6 0.0 1.0)
@@ -27,8 +18,7 @@
 
 ;Pipe over drawbridge
 
-(define pipe1(pipe 144.0 171.5 -0.5 144.0 166.5 -0.5 1.5))
-(set-primary-color pipe1 0.9 0.6 0.0 1.0)
+(set-primary-color (pipe 144.0 171.5 -0.5 144.0 166.5 -0.5 1.5) 0.9 0.6 0.0 1.0)
 
 
 ;palace guards.
@@ -126,6 +116,7 @@
 (diamond 158.5 184.5)
 
 
+
 ;fountains in garden.
 
 
@@ -244,24 +235,24 @@
 
 (define blinker (add-colormodifier 3 159 148 0.5 1.0 0.5 1.0))
 (trigger-once 158.5 147.5 0.5 (lambda ()
-(set-cell-heights 164 184 164 186 -0.5 -0.5 0.0 0.0)
-(set-cell-heights 165 184 165 186 0.0 0.0 0.5 0.5)
-(set-cell-heights 166 184 166 186 0.5 0.5 1.0 1.0)
-(set-primary-color (sign "You may cross the Garden." 0.8 1.0 -0.1 159 148) 0.9 0.6 0.0 1.0)
-(set-onoff blinker #f)
+  (set-cell-heights 164 184 164 186 -0.5 -0.5 0.0 0.0)
+  (set-cell-heights 165 184 165 186 0.0 0.0 0.5 0.5)
+  (set-cell-heights 166 184 166 186 0.5 0.5 1.0 1.0)
+  (set-primary-color (sign "You may cross the Garden." 0.8 1.0 -0.1 159 148) 0.9 0.6 0.0 1.0)
+  (set-onoff blinker #f)
 ))
 
 
 ;;pipe out of garden.
 
 (define pipe1(pipe 168 182.5 1.5 168 181.5 1.5 0.6))
-(set-primary-color pipe1 0.9 0.6 0.0 1.5)
+(set-primary-color pipe1 0.9 0.6 0.0 1.0)
 
 (set-primary-color (pipe-connector 168 181.5 1.5 0.6) 0.9 0.6 0.0 1.0)
 
-(define pipe2(pipe 168 181.5 1.4 168.0 180.5 -4.9 0.5))
+(define pipe2(pipe 168 181.5 1.2 168.0 180.5 -5.0 0.5))
 (set-primary-color pipe2 0.9 0.6 0.0 1.0)
-(set-wind pipe2 -12.0 -6.0)
+(set-wind pipe2 -30.0 -9.0)
 
 (set-primary-color (pipe-connector 168.0 180.5 -4.9 0.5) 0.9 0.6 0.0 1.0)
 
@@ -269,7 +260,6 @@
 (set-primary-color pipe3 0.9 0.6 0.0 1.0)
 
 
-
 ;;End of level
 
 (add-goal 183 141 #f "")
diff --git a/share/levels/motion1.map b/share/levels/motion1.map
index a54b170..a18fd5d 100644
Binary files a/share/levels/motion1.map and b/share/levels/motion1.map differ
diff --git a/share/levels/motion1.scm b/share/levels/motion1.scm
index d9a1469..c3ef589 100644
--- a/share/levels/motion1.scm
+++ b/share/levels/motion1.scm
@@ -12,17 +12,6 @@
 
 (day)
 
-
-
-;;Set ball velocity.
-
-(define speed 0.3)
-(cond
- ((= (difficulty) *easy*) (set! speed 0.20))
- ((= (difficulty) *normal*) (set! speed 0.30))
- ((= (difficulty) *hard*) (set! speed 0.40)))
-
-
 ;;Flags.
 
 (add-flag 14 18 350 #t 0.1)
@@ -31,7 +20,15 @@
 (add-flag 16 40 200 #t 0.1)
 
 
-
+;; Pit guardian
+(define pit-boss (new-mr-black 125 105))
+(cond
+ ((= (difficulty) *easy*) (set-acceleration pit-boss 2.0))
+ ((= (difficulty) *normal*) (set-acceleration pit-boss 4.0))
+ ((= (difficulty) *hard*) (set-acceleration pit-boss 7.0)))
+(set-horizon pit-boss 15.0)
+(set-primary-color pit-boss 1.0 1.0 1.0 1.0)
+(set-modtime pit-boss *mod-spike* -1.)
 
 
 ;;Platform
@@ -40,95 +37,61 @@
  ;;; Positions
 101 80 102 81 
  ;;; Low, High, Time Offset, Speed
- -8.0 5. 0.0 0.75)
+ -8.0 5. 0.0 0.95)
 
 
+(define pipe-path 
+  '((101.5 80.8  5.1)
+    (101.5 81.8  8.6)
+    (101.5 100.0 8.2)
+    (114.5 88.0  1.0)
+    (112.5 97.0 -3.5)
+    (116.5 103.0 -3.5)
+    (134.5 100.0 7.5)
+    (133.5 118.0 6.5)
+    (108.5 115.0 -4.0)))
 
+(map (lambda (p) (set-primary-color (set-wind p 10. 10.) 0.5 0.0 0.0 0.3))
+     (multi-pipe pipe-path 1.3 #t))
 
 
-
-;;PIPES 
-
 ;scoop
 
-(define pipe1(pipe 101.5 81.0 4.8 101.5 83.0 8.5 1.4))
-(set-primary-color pipe1 0.5 0.0 0.0 0.3)
-(set-wind pipe1 15.0 0.0)
-
-(set-primary-color (pipe-connector 101.5 83.0 8.5 1.4) 0.5 0.0 0.0 0.3)
-
-(define pipe2(pipe 101.5 83.0 8.7 101.5 99.5 8.7 1.0))
-(set-primary-color pipe2 0.5 0.0 0.0 0.3)
-(set-wind pipe2 3.5 0.0)
-
-
-;1st turn.
- 
-(set-primary-color (pipe-connector 101.5 100.0 8.7 1.1) 0.5 0.0 0.0 0.3)
-
-(define pipe3(pipe 101.6 99.9 8.6 114.4 87.9 1.2 1.0))
-(set-primary-color pipe3 0.5 0.0 0.0 0.3)
-(set-wind pipe3 0.0 1.0)
-
-;2nd turn.
-
-(set-primary-color (pipe-connector 114.6 88.0 1.0 1.1) 0.5 0.0 0.0 0.3)
-
-(define pipe4(pipe 114.7 87.9 1.0 114.7 99.7 -3.5 1.0))
-(set-primary-color pipe4 0.5 0.0 0.0 0.3)
-(set-wind pipe4 2.0 0.0)
-
-;3rd turn. (up)
-
-(set-primary-color (pipe-connector 114.7 100 -3.4 1.2) 0.5 0.0 0.0 0.3)
-
-(define pipe5(pipe 114.4 100 -3.6 134.4 100.1 7.6 1.0))
-(set-primary-color pipe5 0.5 0.0 0.0 0.3)
-(set-wind pipe5 6.5 0.0)
-
-;4th turn.
-
-(set-primary-color (pipe-connector 134.7 100.1 7.4 1.0) 0.5 0.0 0.0 0.3)
-
-(define pipe6(pipe 134.7 100.0 7.4 134.7 119.6 7.4 1.0))
-(set-primary-color pipe6 0.5 0.0 0.0 0.3)
-(set-wind pipe6 3.0 0.0)
-
-;last turn (down to shute).
-
-(set-primary-color (pipe-connector 134.7 120 7.5 1.0) 0.5 0.0 0.0 0.3)
-
-(define pipe7(pipe 134.8 120.0 7.5 106.5 114.0 -4.0 1.0))
-(set-primary-color pipe7 0.5 0.0 0.0 0.3)
-(set-wind pipe7 1.0 0.0)
-
 ;Drop shute
 
-(define pipe8(pipe 104 114 -7.5 103.5 114 -9.5 1.5))
+(define pipe8 (pipe 104 114 -7.5 103.5 114.2 -9.5 1.5))
 (set-primary-color pipe8 0.9 0.9 0.9 0.9)
-(set-wind pipe8 -10.0 0.0)
+(set-wind pipe8 5.0 5.0)
 
 ;connector
 
-
 (set-primary-color (pipe-connector 103.5 114 -9.5 1.5) 0.9 0.9 0.9 0.9)
 
-(define pipe9(pipe 103.5 114.3 -9.8 102.0 121 -9.8 1.0))
-(set-primary-color pipe8 0.9 0.9 0.9 0.9)
-(set-wind pipe8 0.0 15.0)
+(define pipe9 (pipe 103.5 112.3 -9.8 103.5 119 -9.8 1.4))
+(set-primary-color pipe9 0.9 0.9 0.9 0.9)
+(set-wind pipe9 10.0 10.0)
+
+(set-primary-color (pipe-connector 103.5 119 -9.8 1.3) 0.9 0.9 0.9 0.9)
 
-(set-primary-color (pipe-connector 102 121 -9.8 1.0) 0.9 0.9 0.9 0.9)
+(define pipe10 (pipe 103.5 118 -9.8 102 121.5 -8.5 1.2))
+(set-primary-color pipe10 0.9 0.9 0.9 0.9)
+(set-wind pipe10 10.0 10.0)
+(set-primary-color (pipe-connector 102 121.5 -8.5 1.1) 0.9 0.9 0.9 0.9)
 
-;;BEGIN LIFT SHUTE
+; begin lift chute
 
-(define shute(pipe 102 121 -9.8 102 122 16.4 1.0))
+(define shute (pipe 102 121.5 -10.5 102 121.5 15.4 1.0))
 (set-primary-color shute 0.9 0.9 0.9 0.3)
-(set-wind shute 4.0 5.0)
+(set-wind shute 10.0 10.0)
+(define shute2 (pipe 102 121.5 15.4 102.3 121.5 16.4 1.0))
+(set-primary-color shute2 0.9 0.9 0.9 0.3)
+(set-wind shute2 3.0 3.0)
 
 
 
 ;;End of level
 
-(add-goal 34 60 #f "bx3")
+(trigger-once 102 122 1.5 (lambda ()
+  (add-goal 124 105 #f "")))
 
 
diff --git a/share/levels/sl5.map b/share/levels/sl5.map
index dd522bb..3643533 100644
Binary files a/share/levels/sl5.map and b/share/levels/sl5.map differ
diff --git a/share/levels/sl5.scm b/share/levels/sl5.scm
index 068219e..2d6bec8 100644
--- a/share/levels/sl5.scm
+++ b/share/levels/sl5.scm
@@ -6,7 +6,7 @@
 (set-author "Ulrik Enstad")
 (set-start-position 95.5 77.5)
 (start-time 1000)
-(scale-oxygen 0.3)
+(scale-oxygen 0.15)
 
 ;; the start
 (add-cactus 76 133 0.3)
@@ -14,9 +14,9 @@
 
 (pipe 76.1 133.0 -1.9 77.0 133.0 -1.9 0.4)
 (pipe-connector 77.0 133.0 -1.9 0.4)
-(pipe 77.0 133.0 -1.9 78.0 133.0 -1.6 0.4)
-(set-wind (pipe-connector 78.0 133.0 -1.6 0.4) 5.0 5.0)
-(set-wind (pipe 78.0 133.0 -1.6 78.1 133.0 2.8 0.4) 5.0 5.0)
+(set-wind (pipe 77.0 133.0 -1.9 78.0 133.0 -1.3 0.4) 2.0 2.0)
+(pipe-connector 78.0 133.0 -1.3 0.4)
+(set-wind (pipe 78.0 133.0 -1.3 78.1 133.0 2.6 0.4) 9.0 9.0)
 
 ;; forcefield blocked mansion gate
 (pipe 89.0 113.0 -1.9 89.0 114.0 -1.9 1.0)
@@ -62,7 +62,7 @@
 
 (add-cyclic-platform 51 89 51 89 -12.3 -8.0 1. .6)
 
-(pipe 75 87 -11.2 53 87 -11.2 0.4)
+(set-primary-color (pipe 75.25 87 -11.2 53.25 87 -11.2 0.45) 0.5 0.5 0.9 1.0)
 
 (define mr-blue
  (set-acceleration
diff --git a/share/levels/sl6.map b/share/levels/sl6.map
index 5b0e6ac..feafb09 100644
Binary files a/share/levels/sl6.map and b/share/levels/sl6.map differ
diff --git a/share/shaders/basic.frag b/share/shaders/basic.frag
index 116a8ce..736cd60 100644
--- a/share/shaders/basic.frag
+++ b/share/shaders/basic.frag
@@ -81,7 +81,7 @@ void main(void) {
 
   // Linear combinations of units need not be units
   vec3 normal;
-  if (flatkey >= 1.) {
+  if (flatkey >= 0.) {
     normal = normalize(inormal);
   } else {
     normal = normalize(cross(dFdx(cpos), dFdy(cpos)));
diff --git a/share/shaders/object.frag b/share/shaders/object.frag
index d300db4..175e064 100644
--- a/share/shaders/object.frag
+++ b/share/shaders/object.frag
@@ -79,7 +79,7 @@ void main(void) {
 
   // Linear combinations of units need not be units
   vec3 normal;
-  if (flatkey >= 1.) {
+  if (flatkey >= 0.) {
     normal = normalize(inormal);
   } else {
     normal = normalize(cross(dFdx(cpos), dFdy(cpos)));
diff --git a/src/animated.cc b/src/animated.cc
index 25e43dc..1b9c38c 100644
--- a/src/animated.cc
+++ b/src/animated.cc
@@ -27,7 +27,6 @@
 
 Animated::Animated() : GameHook() {
   Game::current->add(this);
-  zero(position);
   for (int i = 0; i < 3; i++) {
     specularColor[i] = 0.0;
     primaryColor[i] = 0.8;
@@ -164,7 +163,7 @@ void Animated::tick(Real dt) { GameHook::tick(dt); }
 void Animated::die(int how) {
   (void)how;
 
-  double pos[3];
+  Coord3d pos;
 
   /* Trigger any callbacks to guile if registered */
   triggerHook(GameHookEvent_Death, NULL);
diff --git a/src/animatedCollection.cc b/src/animatedCollection.cc
index 1b89e6f..360678e 100644
--- a/src/animatedCollection.cc
+++ b/src/animatedCollection.cc
@@ -801,7 +801,16 @@ static struct Rectangle<3> rectFromAnim(const Animated* a) {
   r.upper[0] = a->position[2] + a->boundingBox[1][2];
 
   for (int i = 0; i < 3; i++) {
-    if (r.lower[i] > r.upper[i]) { error("Impossible rectangle"); }
+    if (r.lower[i] > r.upper[i] || !std::isfinite(r.lower[i]) || !std::isfinite(r.upper[i])) {
+      warning("Invalid bounding box");
+      r.lower[0] = 0.;
+      r.lower[1] = 0.;
+      r.lower[2] = 0.;
+      r.upper[0] = 0.;
+      r.upper[1] = 0.;
+      r.upper[2] = 0.;
+      return r;
+    }
   }
   return r;
 }
diff --git a/src/animator.cc b/src/animator.cc
index de96d85..44bbe17 100644
--- a/src/animator.cc
+++ b/src/animator.cc
@@ -23,12 +23,11 @@
 #include "gameHook.h"
 #include "general.h"
 #include "guile.h"
-#include "math.h"
 
 Animator::Animator(Real length, Real position, Real direction, Real v0, Real v1, int repeat,
                    SCM fun)
     : direction(direction),
-      position(fmod(position, 1.0)),
+      position(std::fmod(position, 1.0)),
       length(length),
       value0(v0),
       value1(v1),
diff --git a/src/baby.cc b/src/baby.cc
index 08ce8b7..b93e56d 100644
--- a/src/baby.cc
+++ b/src/baby.cc
@@ -51,11 +51,3 @@ void Baby::die(int how) {
 }
 
 Baby::~Baby() {}
-
-Boolean Baby::crash(Real speed, Ball *ball) {
-  if (ball == (Ball *)Game::current->player1) {
-    die(DIE_CRASH);
-    return false;
-  }
-  return Ball::crash(speed);
-}
diff --git a/src/baby.h b/src/baby.h
index def3f46..6bcb1dd 100644
--- a/src/baby.h
+++ b/src/baby.h
@@ -28,9 +28,6 @@ class Baby : public Black {
   Baby(Real x, Real y);
   ~Baby();
   void die(int how);
-
-  Boolean crash(Real speed,
-                Ball *);  // When we crash into another ball. Returns if we are still alive
 };
 
 #endif
diff --git a/src/ball.cc b/src/ball.cc
index ff7edb8..2af1365 100644
--- a/src/ball.cc
+++ b/src/ball.cc
@@ -34,9 +34,10 @@
 #include "splash.h"
 #include "trampoline.h"
 
-#include <math.h>
 #include <set>
 
+#define MAX_CONTACT_POINTS 24
+
 GLfloat Ball::dizzyTexCoords[4] = {0.f, 0.f, 1.f, 1.f};
 extern GLuint hiresSphere;
 
@@ -57,10 +58,9 @@ Ball::Ball() : Animated() {
   sink = 0.0;
 
   ballResolution = BALL_LORES;
-  zero(position);
-  zero(velocity);
   friction = 1.0;
   rotation[0] = rotation[1] = 0.0;
+  rotoacc[0] = rotoacc[1] = 0.0;
 
   primaryColor[0] = 0.8;
   primaryColor[1] = 0.8;
@@ -75,6 +75,8 @@ Ball::Ball() : Animated() {
   Game::current->balls->insert(this);
   no_physics = 0;
   inPipe = 0;
+  nextJumpStrength = 0.0;
+  acceleration = 4.0;
 
   for (int i = 0; i < NUM_MODS; i++) {
     modTimeLeft[i] = 0.0;
@@ -107,6 +109,12 @@ int Ball::generateBuffers(GLuint *&idxbufs, GLuint *&databufs) {
       primaryColor[2],
       1.,
   };
+  if (0) {
+    /* useful debug code */
+    if (inTheAir) {
+      for (int k = 0; k < 3; k++) { color[k] = 1. - color[k]; }
+    }
+  }
   GLfloat loc[3] = {(GLfloat)position[0], (GLfloat)position[1], (GLfloat)(position[2] - sink)};
   if (modTimeLeft[MOD_GLASS]) {
     double phase = std::min(modTimePhaseIn[MOD_GLASS] / 2.0, 1.0);
@@ -176,7 +184,7 @@ int Ball::generateBuffers(GLuint *&idxbufs, GLuint *&databufs) {
   if (modTimeLeft[MOD_SPIKE]) {
     /* spikes correspond to icosahedral faces */
     const GLfloat w = (1 + std::sqrt(5)) / 2;
-    Coord3d icoverts[12] = {
+    double icoverts[12][3] = {
         {-1, w, 0},  {1, w, 0},  {-1, -w, 0}, {1, -w, 0}, {0, -1, w},  {0, 1, w},
         {0, -1, -w}, {0, 1, -w}, {w, 0, -1},  {w, 0, 1},  {-w, 0, -1}, {-w, 0, 1},
     };
@@ -203,23 +211,19 @@ int Ball::generateBuffers(GLuint *&idxbufs, GLuint *&databufs) {
     ushort idxs[20 * 3][3];
     char *pos = (char *)data;
     for (int i = 0; i < 20; i++) {
-      Coord3d centroid = {0., 0., 0.};
-      for (int j = 0; j < 3; j++) { add(centroid, icoverts[icofaces[i][j]], centroid); }
-      for (int k = 0; k < 3; k++) centroid[k] /= 3.0;
-
-      Coord3d spike;
-      assign(centroid, spike);
-      for (int k = 0; k < 3; k++) spike[k] *= 0.87 * scale;
-      Coord3d sub;
-      useMatrix(trot, spike, sub);
+      Coord3d centroid;
+      for (int j = 0; j < 3; j++) { centroid = centroid + Coord3d(icoverts[icofaces[i][j]]); }
+      centroid = centroid / 3.0;
+
+      Coord3d spike = centroid;
+      spike = spike * 0.87 * scale;
+      Coord3d sub = useMatrix(trot, spike);
       pos += packObjectVertex(pos, loc[0] + sub[0], loc[1] + sub[1], loc[2] + sub[2], 0., 0.,
                               sco, flat);
       for (int j = 2; j >= 0; j--) {
-        Coord3d edge;
-        assign(icoverts[icofaces[i][j]], edge);
-        for (int k = 0; k < 3; k++)
-          edge[k] = 0.3 * scale * (0.1 * centroid[k] + 0.9 * edge[k]);
-        useMatrix(trot, edge, sub);
+        Coord3d edge(icoverts[icofaces[i][j]]);
+        edge = 0.3 * scale * (0.1 * centroid + 0.9 * edge);
+        sub = useMatrix(trot, edge);
         pos += packObjectVertex(pos, loc[0] + sub[0], loc[1] + sub[1], loc[2] + sub[2], 0., 0.,
                                 sco, flat);
       }
@@ -253,11 +257,10 @@ int Ball::generateBuffers(GLuint *&idxbufs, GLuint *&databufs) {
     for (int i = 0; i < nlines; i++) {
       double angle = i * M_PI / (nlines - 1) - M_PI / 2;
 
-      Coord3d v;
-      assign(velocity, v);
+      Coord3d v = velocity;
       v[2] = 0.0;
       if (length(v) > 0.8) {
-        normalize(v);
+        v = v / length(v);
         double z = (rand() % 1000) / 1000.0;
 
         data[2 * i][0] = loc[0] + std::sin(angle) * radius * v[1];
@@ -664,23 +667,7 @@ void Ball::tick(Real time) {
   }
 
   /* Nitro balls create "debris" clouds constantly */
-  if (modTimeLeft[MOD_NITRO]) {
-    nitroDebrisCount += time;
-    while (nitroDebrisCount > 0.0) {
-      nitroDebrisCount -= 0.25;
-      Debris *d = new Debris(this, position, velocity, 2.0 + 2.0 * frandom());
-      d->position[0] += (frandom() - 0.5) * radius;
-      d->position[1] += (frandom() - 0.5) * radius;
-      d->position[2] += radius * 1.0;
-      d->velocity[2] += 0.2;
-      d->gravity = -0.1;
-      d->modTimeLeft[MOD_GLASS] = -1.0;
-      d->primaryColor[0] = 0.1;
-      d->primaryColor[1] = 0.6;
-      d->primaryColor[2] = 0.1;
-      d->no_physics = 1;
-    }
-  }
+  if (modTimeLeft[MOD_NITRO]) generateNitroDebris(time);
 
   radius = realRadius;
   if (modTimeLeft[MOD_LARGE]) {
@@ -718,75 +705,143 @@ void Ball::setReflectivity(double reflectivity, int metallic) {
   }
 }
 
-Boolean Ball::physics(Real time) {
-  Real x, y;
-
+bool Ball::physics(Real time) {
   if (!Game::current) return true;
   Map *map = Game::current->map;
 
   if (modTimeLeft[MOD_DIZZY]) {
-    /* Explanation. We cast the address of the ball into an integer in order to get
-       a unique random seed for every ball. Could possibly cause problems on 64 bit platforms,
-       have to
-       look into it. */
+    /* We cast the address of the ball into an integer in order to get a unique random seed for
+     * every ball. */
     rotation[0] += time * 7.0 * (frand((long)Game::current->gameTime + (long)this) - 0.5);
     rotation[1] += time * 7.0 * (frand(47 + (long)Game::current->gameTime + (long)this) - 0.5);
   }
 
-  /*  rotateX(-rotation[1]*time*2.0*M_PI*radius,rotations);
-          rotateY(-rotation[0]*time*2.0*M_PI*radius,rotations);*/
+  /* Ball self-drive */
+  double effective_acceleration = acceleration;
+  if (modTimeLeft[MOD_SPEED]) effective_acceleration *= 1.5;
+  if (modTimeLeft[MOD_DIZZY]) effective_acceleration /= 2.0;
+  if (modTimeLeft[MOD_NITRO]) {
+    /* Mod-nitro induces maximal acceleration in a direction of interest */
+    effective_acceleration *= 3.0;
+    double dlen = std::sqrt(rotoacc[0] * rotoacc[0] + rotoacc[1] * rotoacc[1]);
+    if (dlen <= 0.) {
+      double rlen = std::sqrt(rotation[0] * rotation[0] + rotation[1] * rotation[1]);
+      if (rlen <= 0.) {
+        double rnd = M_PI2 * frand();
+        rotoacc[0] = std::sin(rnd);
+        rotoacc[1] = std::cos(rnd);
+      } else {
+        rotoacc[0] = rotation[0] / rlen;
+        rotoacc[1] = rotation[1] / rlen;
+      }
+    } else {
+      rotoacc[0] = rotoacc[0] / dlen;
+      rotoacc[1] = rotoacc[1] / dlen;
+    }
+  }
+  if (modTimeLeft[MOD_FROZEN]) effective_acceleration = 0.;
+  rotation[0] += effective_acceleration * time * rotoacc[0];
+  rotation[1] += effective_acceleration * time * rotoacc[1];
+
   rotateX(-rotation[1] * time * 2.0 * M_PI * 0.3 * 0.3 / radius, rotations);
   rotateY(-rotation[0] * time * 2.0 * M_PI * 0.3 * 0.3 / radius, rotations);
 
-  Cell &c = map->cell((int)position[0], (int)position[1]);
-  Coord3d normal;
-  c.getNormal(normal, Cell::CENTER);
-
-  Real mapHeight = map->getHeight(position[0], position[1]);
-
+  /* Interact with terrain */
+  Cell *cells[MAX_CONTACT_POINTS];
+  Coord3d hitpts[MAX_CONTACT_POINTS];
+  Coord3d normals[MAX_CONTACT_POINTS];
+  ICoord2d cellco[MAX_CONTACT_POINTS];
+  double dhs[MAX_CONTACT_POINTS];
+  double min_height_above_ground = 1.0;
+  int nhits =
+      locateContactPoints(map, cells, hitpts, normals, cellco, dhs, &min_height_above_ground);
+  Coord3d wall_normals[MAX_CONTACT_POINTS];
+  int nwalls = locateWallBounces(map, wall_normals);
+
+  const double wall_thresh = 0.35;
+
+  double max_dx = 0., min_dx = 0., max_dy = 0., min_dy = 0.;
+  for (int i = 0; i < nhits; i++) {
+    if (normals[i][2] < wall_thresh) {
+      if (dhs[i] < 0.) { /* Steep wall, bounce the normal */
+        if (nwalls < MAX_CONTACT_POINTS) {
+          wall_normals[nwalls] = normals[i];
+          nwalls++;
+        }
+      }
+    }
+    /* Greatest axis-aligned slopes contribute */
+    double dx = normals[i][0] / std::max(normals[i][2], wall_thresh);
+    double dy = normals[i][1] / std::max(normals[i][2], wall_thresh);
+    max_dx = std::max(dx, max_dx);
+    min_dx = std::min(dx, min_dx);
+    max_dy = std::max(dy, max_dy);
+    min_dy = std::min(dy, min_dy);
+  }
   /* All effects of gravity */
   if (inTheAir)
     velocity[2] = velocity[2] - gravity * time;
   else if (!inPipe) {
-    double scale = gravity * time / normal[2];
-    velocity[0] += normal[0] * scale;  // gravity * time;
-    velocity[1] += normal[1] * scale;  // gravity * time;
+    velocity[0] += gravity * time * (max_dx + min_dx);
+    velocity[1] += gravity * time * (max_dy + min_dy);
   }
 
-  /* Sand - generate debris */
-  if (!inPipe && c.flags & CELL_SAND && !inTheAir && radius > 0.2) {
-    double speed =
-        velocity[0] * velocity[0] + velocity[1] * velocity[1] + velocity[2] * velocity[2];
-    if (frandom() < (speed - 0.3) * 0.08) {
-      /* lots of friction when we crash into sand */
-      velocity[0] *= 0.9;
-      velocity[1] *= 0.9;
-      velocity[2] *= 0.9;
-      generateSandDebris();
+  /* Compute terrain interaction fractions */
+  double sand_frac = 0., acid_frac = 0., ice_frac = 0., track_frac = 0.;
+  for (int i = 0; i < nhits; i++) {
+    if (cells[i]->flags & CELL_ACID) acid_frac += 1. / nhits;
+    if (cells[i]->flags & CELL_SAND) sand_frac += 1. / nhits;
+    if (cells[i]->flags & CELL_ICE) ice_frac += 1. / nhits;
+    if (cells[i]->flags & CELL_TRACK) track_frac += 1. / nhits;
+  }
+
+  /* Execute possible planned jump */
+  if (nextJumpStrength > 0.) {
+    if (!inTheAir && acid_frac < 0.99) {
+      velocity[2] += nextJumpStrength * (1.0 - acid_frac);
+      position[2] += 0.10 * radius;
+      /* correct contact height estimates; see handleGround */
+      for (int i = 0; i < nhits; i++) { dhs[i] += 0.10 * radius; }
+      inTheAir = true;
     }
-  } else if (Settings::settings->difficulty > 0 && !inPipe && modTimeLeft[MOD_SPIKE] &&
-             !inTheAir && radius > 0.2) {
-    double speed =
+  }
+  nextJumpStrength = 0.;
+
+  /* Sand - generate debris */
+  if (!inTheAir && radius > 0.2 && !inPipe) {
+    double speed2 =
         velocity[0] * velocity[0] + velocity[1] * velocity[1] + velocity[2] * velocity[2];
-    if (frandom() < (speed - 0.3) * 0.0007 * Settings::settings->difficulty) {
-      velocity[0] *= 0.9;
-      velocity[1] *= 0.9;
-      velocity[2] *= 0.9;
-      generateDebris(c.colors[Cell::CENTER]);
+    if (sand_frac > 0.) {
+      if (frandom() < (speed2 - 0.3) * 0.08) {
+        /* lots of friction when we crash into sand */
+        double slowdown = std::pow(0.9, sand_frac);
+        velocity[0] *= slowdown;
+        velocity[1] *= slowdown;
+        velocity[2] *= slowdown;
+        generateSandDebris();
+      }
+    } else if (Settings::settings->difficulty > 0 && modTimeLeft[MOD_SPIKE]) {
+      if (frandom() < (speed2 - 0.3) * 0.0007 * Settings::settings->difficulty) {
+        velocity[0] *= 0.9;
+        velocity[1] *= 0.9;
+        velocity[2] *= 0.9;
+        Cell &c = map->cell((int)position[0], (int)position[1]);
+        generateDebris(c.colors[Cell::CENTER]);
+      }
     }
   }
 
   /* All effects of water */
+  Real mapHeight = map->getHeight(position[0], position[1]);
+  double waterHeight = map->getWaterHeight(position[0], position[1]);
   {
-    double waterHeight = map->getWaterHeight(position[0], position[1]);
-
     /* Floating */
     if (modTimeLeft[MOD_FLOAT] && !inPipe && waterHeight > position[2] &&
         waterHeight > mapHeight + radius + 0.025) {
       velocity[2] += gravity * time * 1.5;
       velocity[2] *= 0.99;
       // avoid sticking to the ground
-      double delta = position[2] - radius - map->getHeight(position[0], position[1]);
+      double delta = position[2] - radius - mapHeight;
       if (delta < 0.025) {
         position[2] += 0.025 - delta;
         if (velocity[2] < 0.0) velocity[2] = 0.0;
@@ -800,9 +855,7 @@ Boolean Ball::physics(Real time) {
                      velocity[2] * velocity[2] * 5.;
       if (frandom() < speed * 0.001 * (depth < 0.5 ? depth : 1.0 - depth) * radius / 0.3) {
         GLfloat waterColor[4] = {0.4, 0.4, 0.8, 0.5};
-        Coord3d center;
-        assign(position, center);
-        center[2] = map->getWaterHeight(center[0], center[1]);
+        Coord3d center(position[0], position[1], waterHeight);
         new Splash(center, velocity, waterColor, 30 * radius / 0.3,
                    radius);  // speed*radius*(depth<0.5?depth:1.0-depth)*2.0,radius);
       }
@@ -810,9 +863,7 @@ Boolean Ball::physics(Real time) {
       speed = rotation[0] * rotation[0] + rotation[1] * rotation[1];
       if (frandom() < speed * 0.001) {
         GLfloat waterColor[4] = {0.4, 0.4, 0.8, 0.5};
-        Coord3d center;
-        assign(position, center);
-        center[2] = map->getWaterHeight(center[0], center[1]);
+        Coord3d center(position[0], position[1], waterHeight);
         Coord3d vel;
         vel[0] = -rotation[0] * radius;  // 0.3;
         vel[1] = -rotation[1] * radius;  // 0.3;
@@ -823,6 +874,8 @@ Boolean Ball::physics(Real time) {
         velocity[1] += 0.01 * rotation[1];
         new Splash(center, vel, waterColor, (int)speed * 0.5, radius);
       }
+      /* cell velocity field extends to the water within the cell */
+      Cell &c = map->cell((int)position[0], (int)position[1]);
       double fric = 0.004 * std::min(1.0, depth / (2. * radius));  // an extra water friction
       velocity[0] = velocity[0] * (1. - fric) + c.velocity[0] * fric;
       velocity[1] = velocity[1] * (1. - fric) + c.velocity[1] * fric;
@@ -831,31 +884,24 @@ Boolean Ball::physics(Real time) {
     }
   }
 
-  if (!inPipe && !inTheAir && c.flags & CELL_KILL) {
-    die(DIE_OTHER);
-    return false;
-  }
-
   /* Sinking into floor material */
-  if (c.flags & CELL_SAND && !inPipe) {
-    sink += 0.8 * time;
-    if (sink > radius * 0.5) sink = radius * 0.5;
-  } else if (c.flags & CELL_ACID && !inPipe && !inTheAir) {
-    sink += 0.8 * time;
-    double speed =
+  if (acid_frac > 0. && !inPipe && !inTheAir) {
+    sink += 0.8 * time * (acid_frac + sand_frac);
+    double speed2 =
         velocity[0] * velocity[0] + velocity[1] * velocity[1] + velocity[2] * velocity[2];
-    if (frandom() < (speed - 0.2) * 0.05) {
+    if (frandom() < (speed2 - 0.2) * 0.05) {
       GLfloat acidColor[4] = {0.1, 0.5, 0.1, 0.5};
-      Coord3d center;
-      assign(position, center);
-      center[2] = map->getHeight(center[0], center[1]);
-      new Splash(center, velocity, acidColor, speed * radius, radius);
+      Coord3d center(position[0], position[1], mapHeight);
+      new Splash(center, velocity, acidColor, speed2 * radius, radius);
     }
     if (modTimeLeft[MOD_GLASS]) sink = std::min(sink, 0.3);
     if (sink > radius * 2.0) {
       die(DIE_ACID);
       return false;
     }
+  } else if (sand_frac > 0. && !inPipe && !inTheAir) {
+    sink += 0.8 * time * (acid_frac + sand_frac);
+    if (sink > 0.5 * sand_frac * radius) sink = 0.5 * sand_frac * radius;
   } else
     sink = std::max(0.0, sink - 2.0 * time);
 
@@ -863,26 +909,24 @@ Boolean Ball::physics(Real time) {
   /* Ground "grip" - Also works in pipes! */
   /*                                      */
   {
-    double v_fric = 0.08;
-    double r_fric = 0.10;
+    const double v_base = 0.08, r_base = 0.10;
 
-    if (c.flags & CELL_ACID) {
-      v_fric = 0.008;
-      r_fric = 0.010;
-    }
+    double v_fric = v_base;
+    double r_fric = r_base;
 
-    if (c.flags & CELL_ICE) {
-      if (modTimeLeft[MOD_SPIKE]) {
-        v_fric = 0.008;
-        r_fric = 0.010;
-      } else {
-        v_fric = 0.0008;
-        r_fric = 0.0010;
-      }
+    v_fric += (0.008 - v_base) * acid_frac;
+    r_fric += (0.010 - r_base) * acid_frac;
+
+    if (modTimeLeft[MOD_SPIKE]) {
+      v_fric += (0.008 - v_base) * ice_frac;
+      r_fric += (0.010 - r_base) * ice_frac;
+    } else {
+      v_fric += (0.0008 - v_base) * ice_frac;
+      r_fric += (0.0010 - r_base) * ice_frac;
     }
 
     if (inTheAir) {
-      if (map->getWaterHeight(position[0], position[1]) > position[2] - radius) {
+      if (waterHeight > position[2] - radius) {
         v_fric = 0.0005;
         r_fric = 0.0005;
       } else
@@ -894,11 +938,18 @@ Boolean Ball::physics(Real time) {
       r_fric = 0.10;
     }
 
-    if (c.flags & CELL_TRACK) {
-      velocity[0] = velocity[0] * (1.0 - v_fric) + (rotation[0] + c.velocity[0]) * v_fric;
-      velocity[1] = velocity[1] * (1.0 - v_fric) + (rotation[1] + c.velocity[1]) * v_fric;
-      rotation[0] = rotation[0] * (1.0 - r_fric) + (velocity[0] - c.velocity[0]) * r_fric;
-      rotation[1] = rotation[1] * (1.0 - r_fric) + (velocity[1] - c.velocity[1]) * r_fric;
+    if (track_frac > 0.) {
+      double trackv[2] = {0., 0.};
+      for (int i = 0; i < nhits; i++) {
+        if (cells[i]->flags & CELL_TRACK) {
+          trackv[0] += cells[i]->velocity[0] / (double)nhits;
+          trackv[1] += cells[i]->velocity[1] / (double)nhits;
+        }
+      }
+      velocity[0] = velocity[0] * (1.0 - v_fric) + (rotation[0] + trackv[0]) * v_fric;
+      velocity[1] = velocity[1] * (1.0 - v_fric) + (rotation[1] + trackv[1]) * v_fric;
+      rotation[0] = rotation[0] * (1.0 - r_fric) + (velocity[0] - trackv[0]) * r_fric;
+      rotation[1] = rotation[1] * (1.0 - r_fric) + (velocity[1] - trackv[1]) * r_fric;
     } else {
       velocity[0] = velocity[0] * (1.0 - v_fric) + rotation[0] * v_fric;
       velocity[1] = velocity[1] * (1.0 - v_fric) + rotation[1] * v_fric;
@@ -916,32 +967,37 @@ Boolean Ball::physics(Real time) {
   else if (!inTheAir) {
     if (inPipe) {
     } else {
-      if (c.flags & CELL_ACID) effective_friction *= 2.0;
-      if (c.flags & CELL_ICE) effective_friction *= 0.1;
-      if (c.flags & CELL_SAND)
-        effective_friction *= (c.flags & CELL_TRACK ? 20.0 : 10.0);
-      else if (c.flags & CELL_TRACK)
-        effective_friction *= 4.0;  // Note. not both sand and track effect
+      effective_friction *= std::pow(2.0, acid_frac);
+      effective_friction *= std::pow(0.1, ice_frac);
+      // sand+track is 20x boost, not 10x
+      effective_friction *= std::pow(10.0, sand_frac);
+      effective_friction *= std::pow(4.0, track_frac);
+      effective_friction *= std::pow(0.5, sand_frac * track_frac);
     }
     if (modTimeLeft[MOD_SPIKE]) effective_friction *= 1.5;
     if (modTimeLeft[MOD_SPEED]) effective_friction *= 0.5;
   }
-  for (int i = 0; i < 2; i++)
-    velocity[i] = velocity[i] - (velocity[i] - c.velocity[i]) * effective_friction;
-  velocity[2] *= 1.0 - effective_friction;
+  double cvel[3] = {0., 0., 0.};
+  for (int i = 0; i < nhits; i++) {
+    cvel[0] += normals[i][2] * cells[i]->velocity[0] / (double)nhits;
+    cvel[1] += normals[i][2] * cells[i]->velocity[1] / (double)nhits;
+    cvel[2] +=
+        -1 * (normals[i][0] * cells[i]->velocity[0] + normals[i][1] * cells[i]->velocity[1]) /
+        (double)nhits;
+  }
+  for (int i = 0; i < 3; i++)
+    velocity[i] = velocity[i] - (velocity[i] - cvel[i]) * effective_friction;
   if (inTheAir && velocity[2] > 5.0) velocity[2] *= 0.995;
 
   for (int i = 0; i < 3; i++) position[i] += time * velocity[i];
 
   if (!inPipe) {
-    handleEdges();
-
-    /* Ground collisions */
-    if (!checkGroundCollisions(map, 0, 0)) return false;
-    for (x = -radius + 0.05; x <= radius - 0.05; x += 0.05)
-      if (!checkGroundCollisions(map, x, 0.0)) return false;
-    for (y = -radius + 0.05; y <= radius - 0.05; y += 0.05)
-      if (!checkGroundCollisions(map, 0.0, y)) return false;
+    /* automatically force ball to map height if it is far enough down */
+    if (mapHeight > position[2] + radius) { position[2] = mapHeight + 0.75 * radius; }
+
+    if (!handleGround(map, cells, hitpts, normals, cellco, dhs, nhits, time)) return false;
+
+    if (!handleWalls(wall_normals, nwalls)) return false;
   }
 
   /* Collisions with other balls */
@@ -950,102 +1006,442 @@ Boolean Ball::physics(Real time) {
   /* Collisions with forcefields */
   handleForcefieldCollisions();
 
-  double dh = position[2] - radius - map->getHeight(position[0], position[1]);
-  if (dh > 0.1) inTheAir = true;
+  if (inPipe || nhits <= 0) inTheAir = true;
 
   /* Pipes */
   handlePipes(time);
+
   return true;
 }
-Boolean Ball::checkGroundCollisions(Map *map, Real x, Real y) {
-  Real dh = position[2] - sqrt(radius * radius - x * x - y * y) -
-            map->getHeight(position[0] + x, position[1] + y);
-  if (dh < 0.02) {
-    if (inTheAir) {
-      /* We where in the air and have now hit the ground. Calculate
-             a bounce */
-
-      /* first, change speed etc. if we are rotating */
-      double v_fric = 0.2;
-      double r_fric = 0.4;
-      velocity[0] = velocity[0] * (1.0 - v_fric) + rotation[0] * v_fric;
-      velocity[1] = velocity[1] * (1.0 - v_fric) + rotation[1] * v_fric;
-      rotation[0] = rotation[0] * (1.0 - r_fric) + velocity[0] * r_fric;
-      rotation[1] = rotation[1] * (1.0 - r_fric) + velocity[1] * r_fric;
-
-      Coord3d normal;
-      Cell &c = map->cell((int)(position[0] + x), (int)(position[1] + y));
-      /* TODO: Use correct normal */
-      c.getNormal(normal, Cell::CENTER);
-
-      Real speed = -dotProduct(velocity, normal);  // or simply -velocity[2];
+static int closestPointOnTriangle(Coord3d tricor[3], const Coord3d &point, Coord3d *closest,
+                                  Coord3d *normal) {
+  Coord3d dv0 = tricor[2] - tricor[0];
+  Coord3d dv1 = tricor[2] - tricor[1];
+  Coord3d baseoff = point - tricor[2];
+  Coord3d nor = crossProduct(dv0, dv1);
+  nor = nor / length(nor);
+  double dist = dotProduct(baseoff, nor);
+  if (dist > 0) {
+    *normal = nor;
+  } else {
+    *normal = -nor;
+  }
+  Coord3d nearoff = baseoff - dist * nor;
+  double s = -dotProduct(nearoff, dv0);
+  double t = -dotProduct(nearoff, dv1);
+  Coord3d m1 = dv0 - dv1;
+  Coord3d nearoffm1 = nearoff + dv1;
+  double r = -dotProduct(nearoffm1, m1);
+  double mm = dotProduct(m1, m1);
+  double uu = dotProduct(dv0, dv0);
+  double vv = dotProduct(dv1, dv1);
+  double uv = dotProduct(dv0, dv1);
+  double idet = 1. / (uu * vv - uv * uv);
+  double a = idet * (vv * s - uv * t);
+  double b = idet * (-uv * s + uu * t);
+  double c = 1 - a - b;
+  if (0. <= a && a <= 1. && 0. <= b && b <= 1. && 0. <= c && c <= 1.) {
+    *closest = tricor[0] * a + tricor[1] * b + tricor[2] * c;
+    return 0;
+  } else if (0. <= s && s <= uu && b <= 0.) {
+    double q = s / uu;
+    *closest = tricor[2] * (1. - q) + tricor[0] * q;
+    return 1;
+  } else if (0. <= t && t <= vv && a <= 0.) {
+    double q = t / vv;
+    *closest = tricor[2] * (1. - q) + tricor[1] * q;
+    return 2;
+  } else if (0. <= r && r <= mm && c <= 0.) {
+    double q = r / mm;
+    *closest = tricor[0] * q + tricor[1] * (1. - q);
+    return 3;
+  } else if (s <= 0. && t <= 0.) {
+    *closest = tricor[2];
+    return 4;
+  } else if (t >= 0. && r <= 0.) {
+    *closest = tricor[1];
+    return 5;
+  } else if (s >= 0 && r >= mm) {
+    *closest = tricor[0];
+    return 6;
+  }
+  warning("cPoT impossible case happened");
+  return -1;
+}
+int Ball::locateContactPoints(class Map *map, class Cell **cells, Coord3d *hitpts,
+                              Coord3d *normals, ICoord2d *cellco, double *dhs,
+                              double *min_height_above_ground) {
+  int nhits = 0;
+  /* Construct a list of triangular facets the ball could interact with,
+   * and locate their closest interaction points. */
+  const double corners[5][2] = {{0., 0.}, {1., 0.}, {1., 1.}, {0., 1.}, {0.5, 0.5}};
+  const int cids[5] = {Cell::SOUTH + Cell::WEST, Cell::SOUTH + Cell::EAST,
+                       Cell::NORTH + Cell::EAST, Cell::NORTH + Cell::WEST, Cell::CENTER};
+  const int triangles[4][3] = {{0, 1, 4}, {1, 2, 4}, {2, 3, 4}, {3, 0, 4}};
+  int xmin = std::floor(position[0] - radius), xmax = std::floor(position[0] + radius);
+  int ymin = std::floor(position[1] - radius), ymax = std::floor(position[1] + radius);
+  for (int x = xmin; x <= xmax; x++) {
+    for (int y = ymin; y <= ymax; y++) {
+      Cell &c = map->cell(x, y);
+      for (int i = 0; i < 4; i++) {
+        Coord3d tricor[3];
+        for (int k = 0; k < 3; k++) {
+          int vno = triangles[i][k];
+          tricor[k][0] = x + corners[vno][0];
+          tricor[k][1] = y + corners[vno][1];
+          tricor[k][2] = c.heights[cids[vno]];
+        }
+        Coord3d closest, normal;
+        int ret = closestPointOnTriangle(tricor, position, &closest, &normal);
+        if (ret < 0) continue;
+
+        /* Only top sides of facets matter; and no getting pulled up */
+        if (normal[2] < 0 || position[2] < closest[2]) continue;
+
+        /* Ensure that ball is over the closest point */
+        double dx = (closest[0] - position[0]), dy = (closest[1] - position[1]);
+        double rad2 = dx * dx + dy * dy;
+        if (rad2 > radius * radius) continue;
+
+        /* Ball must be closer than 0.07*radius to closest point */
+        Real dh = position[2] - std::sqrt(std::max(radius * radius - rad2, 0.)) - closest[2];
+        *min_height_above_ground = std::min(*min_height_above_ground, dh);
+        if (dh >= 0.07 * radius) continue;
+
+        if (nhits >= MAX_CONTACT_POINTS) continue;
+        cells[nhits] = &c;
+        hitpts[nhits] = closest;
+        normals[nhits] = normal;
+        cellco[nhits][0] = x;
+        cellco[nhits][1] = y;
+        dhs[nhits] = dh;
+        nhits++;
+      }
+    }
+  }
+  return nhits;
+}
+bool Ball::handleGround(class Map *map, Cell **cells, Coord3d *hitpts, Coord3d *normals,
+                        ICoord2d *cellco, double *dhs, int nhits, Real time) {
+  /* If there are no points of contact, done */
+  if (nhits == 0) return true;
+
+  /* For each point of contact, compute interaction */
+  double weight = 1. / nhits;
+
+  if (inTheAir) {
+    /* General contact friction */
+    double v_fric = 0.2;
+    double r_fric = 0.4;
+    velocity[0] = velocity[0] * (1.0 - v_fric) + rotation[0] * v_fric;
+    velocity[1] = velocity[1] * (1.0 - v_fric) + rotation[1] * v_fric;
+    rotation[0] = rotation[0] * (1.0 - r_fric) + velocity[0] * r_fric;
+    rotation[1] = rotation[1] * (1.0 - r_fric) + velocity[1] * r_fric;
+
+    /* Crash handling */
+    int trampcell[MAX_CONTACT_POINTS][2];
+    double trampspeed[MAX_CONTACT_POINTS];
+    int nspeeds[MAX_CONTACT_POINTS];
+    int ntramp = 0;
+
+    int nacidsplash = 0;
+    int acidSpeed = 0.;
+
+    int nsandcells = 0;
+    double sandSpeed = 0;
+
+    Coord3d velbounce;
+    double max_crash_speed = 0.;
+    for (int i = 0; i < nhits; i++) {
+      Real speed = -dotProduct(velocity, normals[i]);
       if (speed > 0) {
-        int tx = (int)(position[0] + x), ty = (int)(position[1] + y);
-        Cell &cell = map->cell(tx, ty);
+        Cell &cell = *cells[i];
 
         double crash_speed = speed;
         if (cell.flags & (CELL_TRAMPOLINE | CELL_SAND)) crash_speed *= 0.4;
         if (modTimeLeft[MOD_JUMP]) crash_speed *= 0.8;
+        max_crash_speed = std::max(crash_speed, max_crash_speed);
 
-        if (!crash(crash_speed)) return false;
         double effective_bounceFactor = bounceFactor;
         if (cell.flags & CELL_ACID) effective_bounceFactor = 0.0;
         if (cell.flags & CELL_SAND) effective_bounceFactor = 0.1;
         if (cell.flags & CELL_TRAMPOLINE) {
-          Real dh = 1.0 * speed * radius * radius * radius;
           effective_bounceFactor += 0.6;
-          for (int i = 0; i < 5; i++) cell.heights[i] -= dh;
-          if (cell.sunken <= 0.0) new Trampoline(tx, ty);
-          cell.sunken += dh;
+
+          /* Boost existing trampoline cell if possible */
+          int ptramp = ntramp;
+          for (int j = 0; j < ntramp; j++) {
+            if (trampcell[j][0] == cellco[i][0] && trampcell[j][1] == cellco[i][1]) {
+              ptramp = j;
+              break;
+            }
+          }
+          if (ptramp == ntramp) {
+            ntramp++;
+            trampspeed[ptramp] = 0.;
+            nspeeds[ptramp] = 0;
+          }
+          trampcell[ptramp][0] = cellco[i][0];
+          trampcell[ptramp][1] = cellco[i][1];
+          trampspeed[ptramp] += speed;
+          nspeeds[ptramp]++;
         }
         speed *= 1.0 + effective_bounceFactor;
-        velocity[0] += normal[0] * speed;
-        velocity[1] += normal[1] * speed;
-        velocity[2] += normal[2] * speed;
+        velbounce = velbounce + weight * normals[i] * speed;
 
         if (cell.flags & CELL_ACID) {
-          GLfloat acidColor[4] = {0.1, 0.5, 0.1, 0.5};
-          Coord3d center;
-          assign(position, center);
-          center[2] = map->getHeight(center[0], center[1]);
-          new Splash(center, velocity, acidColor, speed * radius * 20.0, radius);
+          nacidsplash++;
+          acidSpeed += speed;
         }
-
         if (cell.flags & CELL_SAND) {
-          /* lots of friction when we crash into sand */
-          velocity[0] *= 0.5;
-          velocity[1] *= 0.5;
-          velocity[2] *= 0.5;
-          if (radius > 0.2)
-            for (int i = 0; i < 10; i++)
-              if (frandom() < (speed - 1.0) * 0.2) generateSandDebris();
-          if (speed > 4.0) playEffect(SFX_SAND_CRASH);
+          nsandcells++;
+          sandSpeed += speed;
         }
       }
+    }
 
-      if (dh < 0.01) { /* ugly fix to stop being caught on edges */
-        Cell &cell = map->cell((int)(position[0] + x), (int)(position[1] + y));
-        velocity[0] -= 0.005 * x;
-        velocity[1] -= 0.005 * y;
-        if (cell.flags & CELL_SAND) {
-          velocity[0] -= 0.5 * x;
-          velocity[1] -= 0.5 * y;
-        }
-      }
+    if (!crash(max_crash_speed)) return false;
+
+    /* Acid splash */
+    if (nacidsplash) {
+      GLfloat acidColor[4] = {0.1, 0.5, 0.1, 0.5};
+      Coord3d center(position[0], position[1], map->getHeight(position[0], position[1]));
+      new Splash(center, velocity, acidColor, (acidSpeed / nacidsplash) * radius * 20.0,
+                 radius);
+    }
+
+    /* Apply bounce */
+    velocity = velocity + velbounce;
+
+    /* Sand handling */
+    if (nsandcells > 0) {
+      /* lots of friction when we crash into sand */
+      double slowdown = std::pow(0.5, nsandcells / (double)nhits);
+      velocity[0] *= slowdown;
+      velocity[1] *= slowdown;
+      velocity[2] *= slowdown;
+      sandSpeed /= nsandcells;
+      if (radius > 0.2)
+        for (int i = 0; i < 10; i++)
+          if (frandom() < (sandSpeed - 1.0) * 0.2) generateSandDebris();
+      if (sandSpeed > 4.0) playEffect(SFX_SAND_CRASH);
     }
 
-    if (velocity[2] > 2.0) {
-      position[2] = position[2] - dh + 0.02;
+    /* Activate trampolines */
+    for (int i = 0; i < ntramp; i++) {
+      Real speed = trampspeed[i] / nspeeds[i];
+      Cell &cell = map->cell(trampcell[i][0], trampcell[i][1]);
+      Real dh = 1.0 * speed * radius * radius * radius;
+      for (int j = 0; j < 5; j++) cell.heights[j] -= dh;
+      if (cell.sunken <= 0.0) new Trampoline(trampcell[i][0], trampcell[i][1]);
+      cell.sunken += dh;
+    }
+  }
+
+  /* Surface attachment & kill cell*/
+  {
+    double meandh = 0.;
+    int ndh = 0;
+    Coord3d meanNormal;
+    for (int i = 0; i < nhits; i++) {
+      Real dh = dhs[i];
+      if (dh > 0.07 * radius) { continue; }
+      /* contact with kill cells is death */
+      if (dh < 0.001 && cells[i]->flags & CELL_KILL) {
+        die(DIE_OTHER);
+        return false;
+      }
+      meandh += dh;
+      meanNormal = meanNormal + normals[i];
+      ndh++;
+    }
+    double dhw = ndh > 0 ? 1. / ndh : 0.;
+    meandh *= dhw;
+    meanNormal = meanNormal * dhw;
+    /* can't be pulled down faster than gravity + slope */
+    double slopedv = -1 * (meanNormal[0] * velocity[0] + meanNormal[1] * velocity[1]);
+
+    double vmin = velocity[2] - time * gravity;
+    double pmin = position[2] + vmin * time;
+
+    if (velocity[2] - slopedv > 2.0) {
+      /* Escape */
+      position[2] -= meandh;
+      position[2] += 0.07 * radius;
+      position[2] = std::max(position[2], pmin);
     } else {
-      position[2] -= dh;
-      velocity[2] -= dh;
+      /* Last bounce not strong enough to pull away; stick to the surface */
+      position[2] -= meandh;
+      if (inTheAir) {
+        position[2] = std::max(position[2], pmin);
+        velocity[2] = slopedv; /* adopt surface vel */
+      } else {
+        double k = 1.0;
+        velocity[2] -= k * meandh;
+        position[2] = std::max(position[2], pmin);
+        velocity[2] = std::min(velocity[2], slopedv);
+        velocity[2] = std::max(velocity[2], vmin);
+      }
       inTheAir = false;
     }
   }
+
+  return true;
+}
+static double sign(double v) {
+  if (v > 0.) return 1.;
+  if (v < 0.) return -1.;
+  return 0.;
+}
+int Ball::locateWallBounces(class Map *map, Coord3d *wall_normals) {
+  /* individual bounce back for each wall segment intersecting the rim of
+   * the ball */
+  int xmin = std::floor(position[0] - radius), xmax = std::floor(position[0] + radius);
+  int ymin = std::floor(position[1] - radius), ymax = std::floor(position[1] + radius);
+  int nwalls = 0;
+  double Z = position[2];
+  for (int x = xmin; x <= xmax; x++) {
+    for (int y = ymin; y <= ymax; y++) {
+      Cell &c = map->cell(x, y);
+      /* handle X walls */
+      for (int ly = 0; ly < 2; ly++) {
+        double yp = (y + ly);
+        double h1 = c.heights[(ly ? Cell::NORTH : Cell::SOUTH) + Cell::WEST];
+        double h2 = c.heights[(ly ? Cell::NORTH : Cell::SOUTH) + Cell::EAST];
+        double s = 0., t = 1.;
+        bool linethere = true;
+        if (h1 > Z && h2 > Z) {
+        } else if (h1 > Z) {
+          t = (Z - h1) / (h2 - h1);
+        } else if (h2 > Z) {
+          s = (Z - h1) / (h2 - h1);
+        } else {
+          linethere = false;
+        }
+        double as = 0., at = 1.;
+        Cell &op = map->cell(x, y + (ly * 2 - 1));
+        double ah1 = op.heights[(ly ? Cell::SOUTH : Cell::NORTH) + Cell::WEST];
+        double ah2 = op.heights[(ly ? Cell::SOUTH : Cell::NORTH) + Cell::EAST];
+        if (ah1 < Z && ah2 < Z) {
+        } else if (ah1 < Z) {
+          at = (Z - ah1) / (ah2 - ah1);
+        } else if (ah2 < Z) {
+          as = (Z - ah1) / (ah2 - ah1);
+        } else {
+          linethere = false;
+        }
+        s = std::max(s, as);
+        t = std::min(t, at);
+        if (s > t) linethere = false;
+
+        if (position[1] > yp && ly == 0) linethere = false;
+        if (position[1] < yp && ly == 1) linethere = false;
+        if (position[1] == yp) linethere = false;
+
+        if (linethere) {
+          int hit = 0;
+          if (x + s <= position[0] && position[0] <= x + t) {
+            if (position[1] > yp && position[1] - radius < yp) hit = 1;
+            if (position[1] < yp && position[1] + radius > yp) hit = 2;
+          }
+          double dsx = (x + s - position[0]), dsy = (yp - position[1]);
+          double dtx = (x + t - position[0]), dty = (yp - position[1]);
+          if (dsx * dsx + dsy * dsy < radius * radius) hit = 3;
+          if (dtx * dtx + dty * dty < radius * radius) hit = 4;
+          if (hit) {
+            wall_normals[nwalls][0] = 0.;
+            wall_normals[nwalls][1] = sign(position[1] - yp);
+            wall_normals[nwalls][2] = 0.;
+            nwalls++;
+          }
+        }
+      }
+      /* handle Y walls */
+      for (int lx = 0; lx < 2; lx++) {
+        double xp = (x + lx);
+        double h1 = c.heights[(lx ? Cell::EAST : Cell::WEST) + Cell::SOUTH];
+        double h2 = c.heights[(lx ? Cell::EAST : Cell::WEST) + Cell::NORTH];
+        double s = 0., t = 1.;
+        bool linethere = true;
+        if (h1 > Z && h2 > Z) {
+        } else if (h1 > Z) {
+          t = (Z - h1) / (h2 - h1);
+        } else if (h2 > Z) {
+          s = (Z - h1) / (h2 - h1);
+        } else {
+          linethere = false;
+        }
+        double as = 0., at = 1.;
+        Cell &op = map->cell(x + (lx * 2 - 1), y);
+        double ah1 = op.heights[(lx ? Cell::WEST : Cell::EAST) + Cell::SOUTH];
+        double ah2 = op.heights[(lx ? Cell::WEST : Cell::EAST) + Cell::NORTH];
+        if (ah1 < Z && ah2 < Z) {
+        } else if (ah1 < Z) {
+          at = (Z - ah1) / (ah2 - ah1);
+        } else if (ah2 < Z) {
+          as = (Z - ah1) / (ah2 - ah1);
+        } else {
+          linethere = false;
+        }
+        s = std::max(s, as);
+        t = std::min(t, at);
+        if (s > t) linethere = false;
+
+        if (position[0] > xp && lx == 0) linethere = false;
+        if (position[0] < xp && lx == 1) linethere = false;
+        if (position[0] == xp) linethere = false;
+
+        if (linethere) {
+          int hit = 0;
+          if (y + s <= position[1] && position[1] <= y + t) {
+            if (position[0] > xp && position[0] - radius < xp) hit = 1;
+            if (position[0] < xp && position[0] + radius > xp) hit = 2;
+          }
+          double dsx = (xp - position[0]), dsy = (y + s - position[1]);
+          double dtx = (xp - position[0]), dty = (y + t - position[1]);
+          if (dsx * dsx + dsy * dsy < radius * radius) hit = 3;
+          if (dtx * dtx + dty * dty < radius * radius) hit = 4;
+          if (hit) {
+            wall_normals[nwalls][0] = sign(position[0] - xp);
+            wall_normals[nwalls][1] = 0.;
+            wall_normals[nwalls][2] = 0.;
+            nwalls++;
+          }
+        }
+      }
+    }
+  }
+  return nwalls;
+}
+bool Ball::handleWalls(Coord3d *wall_normals, int nwalls) {
+  Coord3d bounce_normal;
+  Coord3d mean_normal;
+  int nbounce = 0;
+  for (int i = 0; i < nwalls; i++) {
+    double crash_speed = -dotProduct(velocity, wall_normals[i]);
+    if (modTimeLeft[MOD_SPEED]) crash_speed *= 0.5;
+    if (modTimeLeft[MOD_NITRO]) crash_speed *= 0.5;
+    if (modTimeLeft[MOD_JUMP]) crash_speed *= 0.8;
+    crash_speed *= 0.5;
+
+    if (crash_speed > 0) {
+      if (!crash(crash_speed)) return false;
+      nbounce++;
+      bounce_normal = bounce_normal + wall_normals[i];
+    }
+    mean_normal = mean_normal + wall_normals[i];
+  }
+
+  if (nbounce) {
+    for (int k = 0; k < 3; k++)
+      velocity[k] -= (1 + bounceFactor) * velocity[k] * std::abs(bounce_normal[k]) / nbounce;
+  }
+
+  if (nwalls) velocity = velocity + 0.1 * mean_normal / nwalls;
   return true;
 }
 
-Boolean Ball::crash(Real speed) {
+bool Ball::crash(Real speed) {
   if (modTimeLeft[MOD_GLASS]) speed *= 1.5;
 
   if (speed > crashTolerance) {
@@ -1064,6 +1460,15 @@ Boolean Ball::crash(Real speed) {
   return true;
 }
 
+void Ball::queueJump(Real strength) {
+  if (strength <= 0.) return;
+  nextJumpStrength = strength;
+}
+void Ball::drive(Real x, Real y) {
+  rotoacc[0] = x;
+  rotoacc[1] = y;
+}
+
 void Ball::generateSandDebris() {
   Coord3d pos, vel;
   Real a = frandom() * 2.0 * M_PI;
@@ -1083,6 +1488,23 @@ void Ball::generateSandDebris() {
   d->friction = 0.0;
   d->calcRadius();
 }
+void Ball::generateNitroDebris(Real time) {
+  nitroDebrisCount += time;
+  while (nitroDebrisCount > 0.0) {
+    nitroDebrisCount -= 0.25;
+    Debris *d = new Debris(this, position, velocity, 1.0 + frandom() * 2.0);
+    d->position[0] += (frandom() - 0.5) * radius;
+    d->position[1] += (frandom() - 0.5) * radius;
+    d->position[2] += frandom() * radius;
+    d->velocity[2] += 0.2;
+    d->gravity = -0.1;
+    d->modTimeLeft[MOD_GLASS] = -1.0;
+    d->primaryColor[0] = 0.1;
+    d->primaryColor[1] = 0.6;
+    d->primaryColor[2] = 0.1;
+    d->no_physics = 1;
+  }
+}
 void Ball::generateDebris(GLfloat color[4]) {
   Coord3d pos, vel;
   Real a = frandom() * 2.0 * M_PI;
@@ -1104,10 +1526,11 @@ void Ball::generateDebris(GLfloat color[4]) {
 }
 
 void Ball::handleBallCollisions() {
+  if (no_physics) return;
+
   const std::set<Animated *> &balls = Game::current->balls->bboxOverlapsWith(this);
   std::set<Animated *>::iterator iter = balls.begin();
   std::set<Animated *>::iterator end = balls.end();
-  Coord3d v;
   double dist, err, speed;
   Ball *ball;
   for (; iter != end; iter++) {
@@ -1115,14 +1538,14 @@ void Ball::handleBallCollisions() {
     if (ball == this) continue;
     if (!ball->alive) continue;
     if (ball->no_physics) continue;
-    sub(ball->position, position, v);
+    Coord3d v = ball->position - position;
     dist = length(v);
     if (dist < radius + ball->radius - 1e-3) {
       err = radius + ball->radius - dist;
       position[0] -= err * v[0];
       position[1] -= err * v[1];
       position[2] -= err * v[2];
-      normalize(v);
+      v = v / length(v);
       speed = dotProduct(v, velocity) - dotProduct(v, ball->velocity);
       if (speed < 1e-3) continue;
       double myWeight = radius * radius * radius,
@@ -1132,10 +1555,8 @@ void Ball::handleBallCollisions() {
       hisWeight /= totWeight;
       this->crash(speed * hisWeight * 1.5 * (ball->modTimeLeft[MOD_SPIKE] ? 6.0 : 1.0));
       ball->crash(speed * myWeight * 1.5 * (this->modTimeLeft[MOD_SPIKE] ? 6.0 : 1.0));
-      for (int i = 0; i < 3; i++) {
-        velocity[i] -= speed * v[i] * 3.0 * hisWeight;
-        ball->velocity[i] += speed * v[i] * 3.0 * myWeight;
-      }
+      velocity = velocity - speed * v * 3.0 * hisWeight;
+      ball->velocity = ball->velocity + speed * v * 3.0 * myWeight;
     }
   }
 }
@@ -1165,17 +1586,17 @@ void Ball::handleForcefieldCollisions() {
     /*                                */
     /* Detailed collision computation */
     /*                                */
-    Coord3d v, ff_normal;
-    sub(this->position, ff->position, v);
+    Coord3d v = this->position - ff->position;
     v[2] = 0.0;
+    Coord3d ff_normal;
     ff_normal[0] = ff->direction[1];
     ff_normal[1] = ff->direction[0];
     ff_normal[2] = 0.0;
-    normalize(ff_normal);
+    ff_normal = ff_normal / length(ff_normal);
     double xy_dist = dotProduct(v, ff_normal);
     // if(xy_dist > this->radius) continue;
-    assign(ff->direction, ff_normal);
-    normalize(ff_normal);
+    ff_normal = ff->direction;
+    ff_normal = ff_normal / length(ff_normal);
     double ff_where = dotProduct(v, ff_normal);  // how long along ff->direction the hit is
     double ff_len = length(ff->direction);       // the xy-length of the forcefield
     if (ff_where < 0) {
@@ -1204,13 +1625,14 @@ void Ball::handleForcefieldCollisions() {
       ff_normal[0] = ff->direction[1];
       ff_normal[1] = ff->direction[0];
       ff_normal[2] = 0.0;
-      normalize(ff_normal);
+      ff_normal = ff_normal / length(ff_normal);
 
       // the direction we are hitting it from
+      Coord3d v;
       v[0] = ff->position[0] + ff_where / ff_len * ff->direction[0] - position[0];
       v[1] = ff->position[1] + ff_where / ff_len * ff->direction[1] - position[1];
       v[2] = ff_where_h - position[2];
-      normalize(v);
+      v = v / length(v);
 
       // sign for direction
       double sign = dotProduct(ff_normal, v);
@@ -1254,124 +1676,53 @@ void Ball::handleForcefieldCollisions() {
     }
   }
 }
-void Ball::handleEdges() {
-  Map *map = Game::current->map;
-
-  if (map->getHeight(position[0] + radius, position[1]) >= position[2] - radius * 0.0) {
-    if (velocity[0] > 0) {
-      crash(velocity[0] * 0.0);
-      velocity[0] *= -bounceFactor;
-    }
-    velocity[0] -= 0.1;  // position[0] -= 0.1;
-  }
-  if (map->getHeight(position[0] - radius, position[1]) >= position[2] - radius * 0.0) {
-    if (velocity[0] < 0) {
-      crash(-velocity[0] * 0.0);
-      velocity[0] *= -bounceFactor;
-    }
-    velocity[0] += 0.1;  // position[0] += 0.1;
-  }
-  if (map->getHeight(position[0], position[1] + radius) >= position[2] - radius * 0.0) {
-    if (velocity[1] > 0) {
-      crash(velocity[1] * 0.0);
-      velocity[1] *= -bounceFactor;
-    }
-    velocity[1] -= 0.1;  // position[1] -= 0.1;
-  }
-  if (map->getHeight(position[0], position[1] - radius) >= position[2] - radius * 0.0) {
-    if (velocity[1] < 0) {
-      crash(-velocity[1] * 0.0);
-      velocity[1] *= -bounceFactor;
-    }
-    velocity[1] += 0.1;  // position[1] += 0.1;
-  }
-
-  const double sqrt2 = 0.7071067;
-  if (map->getHeight(position[0] + radius * sqrt2, position[1] + radius * sqrt2) >=
-      position[2] - radius * 0.0) {
-    if (velocity[0] > 0) {
-      crash(velocity[0] * 0.0);
-      velocity[0] *= -bounceFactor;
-    }
-    velocity[0] -= 0.1;  // position[0] -= 0.1;
-    if (velocity[1] > 0) {
-      crash(velocity[1] * 0.0);
-      velocity[1] *= -bounceFactor;
-    }
-    velocity[1] -= 0.1;  // position[1] -= 0.1;
-  }
-  if (map->getHeight(position[0] - radius * sqrt2, position[1] + radius * sqrt2) >=
-      position[2] - radius * 0.0) {
-    if (velocity[0] < 0) {
-      crash(-velocity[0] * 0.0);
-      velocity[0] *= -bounceFactor;
-    }
-    velocity[0] += 0.1;  // position[0] += 0.1;
-    if (velocity[1] > 0) {
-      crash(velocity[1] * 0.0);
-      velocity[1] *= -bounceFactor;
-    }
-    velocity[1] -= 0.1;  // position[1] -= 0.1;
-  }
-  if (map->getHeight(position[0] + radius * sqrt2, position[1] - radius * sqrt2) >=
-      position[2] - radius * 0.0) {
-    if (velocity[0] > 0) {
-      crash(velocity[0] * 0.0);
-      velocity[0] *= -bounceFactor;
-    }
-    velocity[0] -= 0.1;  // position[0] -= 0.1;
-    if (velocity[1] < 0) {
-      crash(-velocity[1] * 0.0);
-      velocity[1] *= -bounceFactor;
-    }
-    velocity[1] += 0.1;  // position[1] += 0.1;
-  }
-  if (map->getHeight(position[0] - radius * sqrt2, position[1] - radius * sqrt2) >=
-      position[2] - radius * 0.0) {
-    if (velocity[0] < 0) {
-      crash(-velocity[0] * 0.0);
-      velocity[0] *= -bounceFactor;
-    }
-    velocity[0] += 0.1;  // position[0] += 0.1;
-    if (velocity[1] < 0) {
-      crash(-velocity[1] * 0.0);
-      velocity[1] *= -bounceFactor;
-    }
-    velocity[1] += 0.1;  // position[1] += 0.1;
-  }
+static void computePipeCoordinates(const Pipe *pipe, const Coord3d &position, double *radial,
+                                   double *axial, double *pipeLength,
+                                   Coord3d *direction_to_axis, Coord3d *axis_direction) {
+  Coord3d direction = pipe->to - pipe->from;
+  double pipelen = length(direction);
+  Coord3d dirNorm = direction / length(direction);  // normalized direction
+  Coord3d v0 = position - pipe->from;               // pipe enterance -> ball position
+  double l = std::max(0.0, std::min(1.0, dotProduct(v0, dirNorm) /
+                                             pipelen));  // where along pipe ball is projected
+  Coord3d proj = pipe->from + l * direction;  // where (as pos) the ball is projected
+  Coord3d v1 = position - proj;               // projection point -> ball position
+  double distance = length(v1);               // how far away from the pipe the ball is
+  *radial = distance;
+  *axial = l;
+  *pipeLength = pipelen;
+  if (length(v1) > 0) v1 = v1 / length(v1);
+  *direction_to_axis = v1;
+  *axis_direction = dirNorm;
 }
 void Ball::handlePipes(Real time) {
   inPipe = false;
 
+  std::set<Pipe *>::iterator aiter = Pipe::pipes->begin();
+  std::set<Pipe *>::iterator aend = Pipe::pipes->end();
+  /* First, we determine if we are in any pipes */
+  for (; aiter != aend; aiter++) {
+    Pipe *pipe = *aiter;
+    double distance, l, pipeLength;
+    Coord3d dirNorm, offset;
+    computePipeCoordinates(pipe, position, &distance, &l, &pipeLength, &offset, &dirNorm);
+    if (distance < pipe->radius && l > 0.0 && l < 1.0) inPipe = true;
+  }
+
+  /* Then we compute the interaction with all the pipes */
   std::set<Pipe *>::iterator iter = Pipe::pipes->begin();
   std::set<Pipe *>::iterator end = Pipe::pipes->end();
   for (; iter != end; iter++) {
     Pipe *pipe = *iter;
-    Coord3d direction;  // direction of pipe
-    Coord3d dirNorm;    // normalized direction
-    sub(pipe->to, pipe->from, direction);
-    double pipeLength = length(direction);
-    sub(pipe->to, pipe->from, dirNorm);
-    normalize(dirNorm);
-    Coord3d v0;  // pipe enterance -> ball position
-    sub(position, pipe->from, v0);
-    double l = std::max(
-        0.0, std::min(1.0, dotProduct(v0, dirNorm) /
-                               length(direction)));  // where along pipe ball is projected
-    Coord3d proj;                                    // where (as pos) the ball is projected
-    for (int i = 0; i < 3; i++) proj[i] = pipe->from[i] + l * direction[i];
-    Coord3d v1;  // projection point -> ball position
-    sub(position, proj, v1);
-    double distance = length(v1);  // how far away from the pipe the ball is
+    double distance, l, pipeLength;
+    Coord3d dirNorm, normal;
+    computePipeCoordinates(pipe, position, &distance, &l, &pipeLength, &normal, &dirNorm);
     if (distance > pipe->radius || l == 0.0 || l == 1.0) {
       /* Ball is on the outside */
       // note. If <inPipe> then we are already inside another pipe. No collision!
       if (pipe->radius > 0.1 && pipe->radius < radius && distance < radius) {
         /* Added code to bounce of too small pipes, except for *realy* thin pipes which
          are meant to be lifts */
-        Coord3d normal;
-        assign(v1, normal);
-        normalize(normal);
         double speed = -dotProduct(velocity, normal);
         if (speed > 0)
           for (int i = 0; i < 3; i++) velocity[i] += speed * normal[i] * 1.5;
@@ -1382,9 +1733,6 @@ void Ball::handlePipes(Real time) {
         if ((pipe->flags & PIPE_SOFT_ENTER) && l < 0.2 / pipeLength) continue;
         if ((pipe->flags & PIPE_SOFT_EXIT) && l > 1.0 - 0.2 / pipeLength) continue;
 
-        Coord3d normal;
-        assign(v1, normal);
-        normalize(normal);
         double speed = -dotProduct(velocity, normal);
         if (speed > 0)
           for (int i = 0; i < 3; i++) velocity[i] += speed * normal[i] * 1.5;
@@ -1392,13 +1740,8 @@ void Ball::handlePipes(Real time) {
         for (int i = 0; i < 3; i++) position[i] += correction * normal[i];
       }
     } else {
-      /* Ball is on the inside */
-      inPipe = true;
       if (distance > pipe->radius * 0.97 - radius && l != 0.0 && l != 1.0) {
         /* Collision from inside */
-        Coord3d normal;
-        assign(v1, normal);
-        normalize(normal);
         double speed = dotProduct(velocity, normal);
         if (speed > 0)
           for (int i = 0; i < 3; i++) velocity[i] -= speed * normal[i] * 1.5;
@@ -1410,9 +1753,7 @@ void Ball::handlePipes(Real time) {
       if (distance > pipe->radius * 0.94 - radius && position[2] < zHere) {
         /* Ball is touching lower part of pipe wall */
         inTheAir = false;
-        Coord3d normal;
-        assign(v1, normal);
-        normalize(normal);
+        normal[2] = std::min(0., normal[2]);
         double scale = gravity * time / (-normal[2] + 1e-3);
         velocity[0] -= normal[0] * scale;
         velocity[1] -= normal[1] * scale;
@@ -1433,19 +1774,17 @@ void Ball::handlePipes(Real time) {
     std::set<PipeConnector *>::iterator end2 = PipeConnector::connectors->end();
     for (; iter2 != end2; iter2++) {
       PipeConnector *connector = *iter2;
-      Coord3d v0;  // ball -> connector
-      sub(connector->position, position, v0);
-      double dist = length(v0);  // Distance ball center, connector center
+      Coord3d v0 = connector->position - position;  // ball -> connector
+      double dist = length(v0);                     // Distance ball center, connector center
       if (dist > connector->radius) {
         /* Ball is outside connector */
         if (dist < connector->radius + radius) {
           /* Collision from outside */
-          normalize(v0);
+          v0 = v0 / length(v0);
           double speed = dotProduct(velocity, v0);
-          if (speed > 0)
-            for (int i = 0; i < 3; i++) velocity[i] -= speed * v0[i] * 1.5;
+          if (speed > 0) velocity = velocity - speed * v0 * 1.5;
           double correction = connector->radius + radius - dist;
-          for (int i = 0; i < 3; i++) position[i] -= correction * v0[i];
+          position = position - correction * v0;
         }
       } else {
         /* Ball is inside connector */
@@ -1453,17 +1792,16 @@ void Ball::handlePipes(Real time) {
 
         if (dist > connector->radius * 0.97 - radius) {
           /* Collision from inside */
-          normalize(v0);
+          v0 = v0 / length(v0);
           double speed = dotProduct(velocity, v0);
-          if (speed > 0)
-            for (int i = 0; i < 3; i++) velocity[i] += speed * v0[i] * 1.5;
+          if (speed > 0) velocity = velocity + speed * v0 * 1.5;
           double correction = dist - (connector->radius * 0.97 - radius);
-          for (int i = 0; i < 3; i++) position[i] += correction * v0[i];
+          position = position + correction * v0;
         }
         if (dist > connector->radius * 0.94 - radius && position[2] < connector->position[2]) {
           /* Ball is touching lower part of connector */
           inTheAir = false;
-          normalize(v0);
+          v0 = v0 / length(v0);
           double scale = 0.5 * gravity * time / (-v0[2] + 1e-3);
           velocity[0] -= v0[0] * scale;
           velocity[1] -= v0[1] * scale;
diff --git a/src/ball.h b/src/ball.h
index fcfb425..4f61b1f 100644
--- a/src/ball.h
+++ b/src/ball.h
@@ -51,7 +51,7 @@ class Ball : public Animated {
  public:
   Ball();
   virtual ~Ball();
-  Boolean physics(Real time);
+  bool physics(Real time);
 
   virtual int generateBuffers(GLuint*& idxbufs, GLuint*& databufs);
   virtual void drawBuffers1(GLuint* idxbufs, GLuint* databufs);
@@ -62,8 +62,10 @@ class Ball : public Animated {
   void onRemove();
   void setReflectivity(double reflectivity, int metallic);
   /* When we crash into something. Returns if we are still alive */
-  virtual Boolean crash(Real speed);
+  virtual bool crash(Real speed);
   virtual void die(int how);
+  void drive(Real xacc, Real yacc);
+  void queueJump(Real strength);
 
   static void init();
 
@@ -71,6 +73,9 @@ class Ball : public Animated {
   int inTheAir, inPipe;
   float modTimeLeft[NUM_MODS], modTimePhaseIn[NUM_MODS];
   float rotation[2];
+  double nextJumpStrength;
+  double rotoacc[2];
+  double acceleration;
 
   /* radius is the *effective* radius, realRadius the real one */
   Real radius, realRadius;
@@ -89,20 +94,25 @@ class Ball : public Animated {
 
  protected:
   double nitroDebrisCount;
+  void generateNitroDebris(Real time);
 
  private:
-  Boolean checkGroundCollisions(class Map*, Real x, Real y);
   double reflectivity;
   int metallic, dontReflectSelf;
 
   static GLfloat dizzyTexCoords[4];
 
+  int locateContactPoints(class Map*, class Cell**, Coord3d*, Coord3d*, ICoord2d*, double*,
+                          double*);
+  int locateWallBounces(class Map*, Coord3d*);
   void generateSandDebris();
   void generateDebris(GLfloat color[4]);
-  void handleEdges();
   void handleBallCollisions();
   void handleForcefieldCollisions();
   void handlePipes(Real time);
+  bool handleGround(class Map*, class Cell**, Coord3d*, Coord3d*, ICoord2d*, double*, int,
+                    Real);
+  bool handleWalls(Coord3d*, int);
 };
 
 #endif
diff --git a/src/bird.cc b/src/bird.cc
index 163fffa..7f2afcc 100644
--- a/src/bird.cc
+++ b/src/bird.cc
@@ -151,7 +151,7 @@ void Bird::tick(Real t) {
     if (!ball->alive) continue;
     if (ball->no_physics) continue;
 
-    sub(position, ball->position, diff);
+    diff = position - ball->position;
     // TODO: improve the collision detection
     if (length(diff) < ball->radius + size * .75) {
       if (ball->modTimeLeft[MOD_SPIKE]) {
diff --git a/src/black.cc b/src/black.cc
index c37eebe..a91f621 100644
--- a/src/black.cc
+++ b/src/black.cc
@@ -33,7 +33,6 @@ Black::Black(Real x, Real y) : Ball() {
   position[0] = x;
   position[1] = y;
   position[2] = Game::current->map->getHeight(position[0], position[1]) + radius;
-  zero(velocity);
   crashTolerance = 7;
 
   /* Set color to black */
@@ -45,7 +44,6 @@ Black::Black(Real x, Real y) : Ball() {
   specularColor[2] = 1.0;
 
   bounceFactor = .8;
-  acceleration = 4.0;
   horizon = 5.0;
   likesPlayer = 1;
 
@@ -88,31 +86,34 @@ void Black::tick(Real t) {
   double dist;
 
   if (Game::current->player1->playing && is_on) {
-    sub(Game::current->player1->position, position, v);
+    Coord3d v = Game::current->player1->position - position;
     dist = length(v);
 
     double d = Game::current->map->getHeight(position[0] + velocity[0] * 1.0,
                                              position[1] + velocity[1] * 1.0);
-    Cell& c1 = Game::current->map->cell((int)position[0], (int)position[1]);
     Cell& c2 = Game::current->map->cell((int)(position[0] + velocity[0] * 1.0),
                                         (int)(position[1] + velocity[1] * 1.0));
 
+    bool expect_fall = d < position[2] - 1.0 && !modTimeLeft[MOD_FLOAT];
+    bool death_cell = c2.flags & CELL_ACID || c2.flags & CELL_KILL;
+
     /* TODO. Make these checks better */
-    if ((d < position[2] - 1.0 && !modTimeLeft[MOD_FLOAT]) ||
-        (!(c1.flags & CELL_ACID) && (c2.flags & CELL_ACID))) {
-      /* Stop, we are near an edge  or acid or ... */
+    if ((expect_fall || death_cell) && !inPipe) {
+      /* Stop, we are near an edge or acid or ... */
       v[0] = velocity[0];
       v[1] = velocity[1];
       v[2] = 0.0;
-      normalize(v);
-      rotation[0] -= v[0] * acceleration * t;
-      rotation[1] -= v[1] * acceleration * t;
+      double vsc = length(v) > 0 ? 1. / length(v) : 0.;
+      v = v * vsc;
+      Ball::drive(-v[0], -v[1]);
     } else if (dist < horizon) {
       /* Go toward the player */
-      normalize(v);
-      rotation[0] += v[0] * acceleration * likesPlayer * t;
-      rotation[1] += v[1] * acceleration * likesPlayer * t;
+      double vsc = length(v) > 0 ? 1. / length(v) : 0.;
+      v = v * vsc;
+      Ball::drive(v[0] * likesPlayer, v[1] * likesPlayer);
     }
+  } else {
+    Ball::drive(0., 0.);
   }
 
   Ball::tick(t);
diff --git a/src/black.h b/src/black.h
index 2a62da8..38f44ad 100644
--- a/src/black.h
+++ b/src/black.h
@@ -32,7 +32,7 @@ class Black : public Ball {
   void tick(Real);
   void draw();
 
-  Real acceleration, horizon;
+  Real horizon;
   int likesPlayer; /* 1: attracted by ply. 0: unaffected. -1: repelled */
 };
 
diff --git a/src/cactus.cc b/src/cactus.cc
index 18cfa25..4748b91 100644
--- a/src/cactus.cc
+++ b/src/cactus.cc
@@ -58,7 +58,7 @@ int Cactus::generateBuffers(GLuint *&idxbufs, GLuint *&databufs) {
 
   allocateBuffers(1, idxbufs, databufs);
 
-  int nsides = 6;
+  const int nsides = 6;
   // Body: 4N+1 verts, 7N faces
   // Spikes: 16N verts, 12N faces
   GLfloat data[nsides * 20 + 1][8];
@@ -178,7 +178,6 @@ void Cactus::drawBuffers2(GLuint * /*idxbufs*/, GLuint * /*databufs*/) {}
 
 void Cactus::tick(Real t) {
   position[2] = Game::current->map->getHeight(position[0], position[1]);
-  Coord3d diff;
 
   // no more used (can be deleted ?)
   if (killed == 2) return;
@@ -204,7 +203,7 @@ void Cactus::tick(Real t) {
     if (!ball->alive) continue;
     if (ball->no_physics) continue;
 
-    sub(position, ball->position, diff);
+    Coord3d diff = position - ball->position;
     if (length(diff) < ball->radius + radius) {
       if (ball->modTimeLeft[MOD_SPIKE]) {
         Animated::die(DIE_OTHER);
diff --git a/src/cyclicPlatform.cc b/src/cyclicPlatform.cc
index f8e5f60..5a443ee 100644
--- a/src/cyclicPlatform.cc
+++ b/src/cyclicPlatform.cc
@@ -25,7 +25,6 @@
 #include "ball.h"
 #include "game.h"
 #include "map.h"
-#include "math.h"
 
 Real timeLow = 2.0, timeRise = 3.0, timeHigh = 2.0, timeFall = 3.0;
 
@@ -43,7 +42,7 @@ CyclicPlatform::CyclicPlatform(int x1, int y1, int x2, int y2, Real low, Real hi
 
 void CyclicPlatform::tick(Real dt) {
   if (is_on) phase += dt / speed;
-  Real t = fmod(phase, 10.0);
+  Real t = std::fmod(phase, 10.0);
   /*
   Real t = Game::current->gameTime + offset;
   t -= ((int)(t/cycleTime)) * cycleTime;*/
diff --git a/src/debris.cc b/src/debris.cc
index 2afac5f..9e7852c 100644
--- a/src/debris.cc
+++ b/src/debris.cc
@@ -21,8 +21,8 @@
 #include "debris.h"
 
 Debris::Debris(Ball *ball, Coord3d pos, Coord3d vel, double dur) {
-  assign(pos, position);
-  assign(vel, velocity);
+  position = pos;
+  velocity = vel;
   crashTolerance = 10000;
   if (ball) {
     for (int i = 0; i < 3; i++) primaryColor[i] = ball->primaryColor[i];
diff --git a/src/diamond.cc b/src/diamond.cc
index 1320759..36c03bc 100644
--- a/src/diamond.cc
+++ b/src/diamond.cc
@@ -26,7 +26,7 @@
 #include "sound.h"
 
 Diamond::Diamond(Coord3d pos) {
-  assign(pos, position);
+  position = pos;
 
   specularColor[0] = specularColor[1] = specularColor[2] = 1.0;
   primaryColor[0] = 0.7;
@@ -92,7 +92,7 @@ void Diamond::drawBuffers2(GLuint *idxbufs, GLuint *databufs) {
 void Diamond::tick(Real t) {
   Coord3d v0;
   if (fade <= 0.0) return;
-  sub(Game::current->player1->position, position, v0);
+  v0 = Game::current->player1->position - position;
   if (length(v0) < 0.3 + Game::current->player1->radius) {
     if (!taken) onGet();
     taken = 1;
@@ -102,12 +102,12 @@ void Diamond::tick(Real t) {
   }
 }
 void Diamond::onGet() {
-  assign(position, Game::current->map->startPosition);
+  Game::current->map->startPosition = position;
   playEffect(SFX_GOT_FLAG);
   fade = -14.0;
 
   Coord3d signPos;
-  assign(position, signPos);
+  signPos = position;
   signPos[2] += 1.0;
   new Sign(_("Save point"), 6.0, 1.0, 60.0, signPos);
 }
diff --git a/src/editMode.cc b/src/editMode.cc
index e29fafb..e7ea94c 100644
--- a/src/editMode.cc
+++ b/src/editMode.cc
@@ -159,6 +159,8 @@ int doAskSave = 0;
 
 int selectedMenu = -1;
 
+const int viewPoints[4][2] = {{1, 1}, {1, -1}, {-1, -1}, {-1, 1}};
+
 EditMode* EditMode::editMode;
 
 void EditMode::loadStrings() {
@@ -367,7 +369,7 @@ void EditMode::display() {
   activeView.fog_enabled = 0;
   activeView.quadratic_attenuation = 0.;
 
-  Coord3d lightPosition = {x - 60., y - 40., h + 100.};
+  GLfloat lightPosition[3] = {(GLfloat)x - 60.f, (GLfloat)y - 40.f, (GLfloat)h + 100.f};
   GLfloat lightDiffuse[3] = {0.9, 0.9, 0.9};
   GLfloat ambient[3] = {0.2, 0.2, 0.2};
   GLfloat black[3] = {0., 0., 0.};
@@ -380,20 +382,17 @@ void EditMode::display() {
   /* Setup matrixes for the camera perspective */
   perspectiveMatrix(40, (GLdouble)screenWidth / (GLdouble)std::max(screenHeight, 1), 0.1, 200,
                     activeView.projection);
-  if (!switchViewpoint) {
-    lookAtMatrix(x - 7.0, y - 7.0, (birdsEye ? 30.0 : 10.0) + h * 0.5, x, y, h, 0.0, 0.0, 1.0,
-                 activeView.modelview);
-  } else {
-    lookAtMatrix(x + 7.0, y + 7.0, (birdsEye ? 30.0 : 10.0) + h * 0.5, x, y, h, 0.0, 0.0, 1.0,
-                 activeView.modelview);
-  }
+
+  lookAtMatrix(x - viewPoints[switchViewpoint][0] * 7.0,
+               y - viewPoints[switchViewpoint][1] * 7.0, (birdsEye ? 30.0 : 10.0) + h * 0.5, x,
+               y, h, 0.0, 0.0, 1.0, activeView.modelview);
 
   activeView.day_mode = 1;
   updateUniforms();
   /* Shadow map rendering returns active modelview/projection to orig state */
   if (map) {
     if (Settings::settings->doShadows) {
-      Coord3d focus = {(double)x, (double)y, map->getHeight(x, y)};
+      Coord3d focus((double)x, (double)y, map->getHeight(x, y));
       renderShadowCascade(focus, map, game);
       renderDummyShadowMap();
     } else {
@@ -786,16 +785,20 @@ void EditMode::doCommand(int command) {
   } break;
 
   case MOVE_UP:
-    x += (switchViewpoint ? -1 : 1) * (ctrl ? 20 : (shift ? 5 : 1));
+    ((switchViewpoint % 2) ? y : x) +=
+        viewPoints[switchViewpoint][1] * (ctrl ? 20 : (shift ? 5 : 1));
     break;
   case MOVE_DOWN:
-    x -= (switchViewpoint ? -1 : 1) * (ctrl ? 20 : (shift ? 5 : 1));
+    ((switchViewpoint % 2) ? y : x) -=
+        viewPoints[switchViewpoint][1] * (ctrl ? 20 : (shift ? 5 : 1));
     break;
   case MOVE_LEFT:
-    y += (switchViewpoint ? -1 : 1) * (ctrl ? 20 : (shift ? 5 : 1));
+    ((switchViewpoint % 2) ? x : y) +=
+        viewPoints[switchViewpoint][0] * (ctrl ? 20 : (shift ? 5 : 1));
     break;
   case MOVE_RIGHT:
-    y -= (switchViewpoint ? -1 : 1) * (ctrl ? 20 : (shift ? 5 : 1));
+    ((switchViewpoint % 2) ? x : y) -=
+        viewPoints[switchViewpoint][0] * (ctrl ? 20 : (shift ? 5 : 1));
     break;
 
   case MOVE_SET_MARKER:
@@ -825,7 +828,7 @@ void EditMode::doCommand(int command) {
     birdsEye = birdsEye ? 0 : 1;
     break;
   case VIEW_ROTATE:
-    switchViewpoint = switchViewpoint ? 0 : 1;
+    switchViewpoint = (switchViewpoint + 1) % 4;
     break;
   case VIEW_CLEAR_ENTITIES:
     if (game) delete game;
@@ -1048,13 +1051,13 @@ void EditMode::doCellAction(int code, int direction) {
 }
 
 void EditMode::key(int key) {
-  int shift = SDL_GetModState() & (KMOD_LSHIFT | KMOD_RSHIFT);
+  int shift = SDL_GetModState() & KMOD_SHIFT;
   int mouseX, mouseY;
   SDL_GetMouseState(&mouseX, &mouseY);
   /* TODO. Send any keys to the EOpenWindow?? */
 
   if (newWindow->isAttached()) {
-    newWindow->key(key, mouseX, mouseY);
+    newWindow->key(key, shift, mouseX, mouseY);
     return;
   }
 
@@ -1105,20 +1108,11 @@ void EditMode::key(int key) {
     return;
   }
 
-  /* Move cursor */
-  /*
-  switch(key) {
-  case SDLK_LEFT: y+=(switchViewpoint?-1:1)*(shift?5:1); break;
-  case SDLK_RIGHT: y-=(switchViewpoint?-1:1)*(shift?5:1); break;
-  case SDLK_UP: x+=(switchViewpoint?-1:1)*(shift?5:1); break;
-  case SDLK_DOWN: x-=(switchViewpoint?-1:1)*(shift?5:1); break;
-  }*/
-
   if (key == SDLK_TAB) { moveKeyboardFocus(shift); }
   if (key == SDLK_RETURN || key == SDLK_KP_ENTER || key == SDLK_SPACE)
     mouseDown(shift ? 3 : 1, -1, -1);
 
-  menuWindow->key(key, shift);
+  menuWindow->key(key, shift, x, y);
 
   return;
 }
diff --git a/src/editWindows.cc b/src/editWindows.cc
index 02a51b8..614916a 100644
--- a/src/editWindows.cc
+++ b/src/editWindows.cc
@@ -96,7 +96,7 @@ int EMenuWindow::keyToMenuEntry(int key, int shift) {
       if (cKeyShortcuts[i][j] == key) return i * MAX_MENU_ENTRIES + j;
   return -1;
 }
-void EMenuWindow::key(int key, int shift) {
+void EMenuWindow::key(int key, int shift, int /*x*/, int /*y*/) {
   if (key >= SDLK_F1 && key <= SDLK_F12) {
     int menu = key - SDLK_F1;
     if (menu >= 0 && menu < N_SUBMENUS) openSubMenu(menu);
@@ -267,9 +267,11 @@ void EStatusWindow::draw() {
   } else if (EditMode::editMode->currentEditMode == EDITMODE_NOLINES) {
     addText_Left(0, fontSize / 2, row1, _("Lines"), col1);
 
-    GLfloat line_off[4][4] = {1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.};
-    GLfloat line_on[4][4] = {0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 1., 0., 0., 0., 1.};
-    GLfloat txco[4][2] = {0., 0., 0., 0., 0., 0., 0., 0.};
+    GLfloat line_off[4][4] = {
+        {1., 1., 1., 1.}, {1., 1., 1., 1.}, {1., 1., 1., 1.}, {1., 1., 1., 1.}};
+    GLfloat line_on[4][4] = {
+        {0., 0., 0., 1.}, {0., 0., 0., 1.}, {0., 0., 0., 1.}, {0., 0., 0., 1.}};
+    GLfloat txco[4][2] = {{0., 0.}, {0., 0.}, {0., 0.}, {0., 0.}};
 
     GLfloat r = 1.5;
     GLfloat lineA[4][2] = {{col1 + 0.f, row3 - r},
@@ -488,9 +490,7 @@ void ENewWindow::mouseDown(int /*state*/, int /*x*/, int /*y*/) {
     remove();
   }
 }
-void ENewWindow::key(int key, int /*x*/, int /*y*/) {
-  int shift = SDL_GetModState() & (KMOD_LSHIFT | KMOD_RSHIFT);
-
+void ENewWindow::key(int key, int shift, int /*x*/, int /*y*/) {
   if (key == SDLK_BACKSPACE) {
     int len = strlen(name);
     if (len > 0) name[len - 1] = 0;
diff --git a/src/editWindows.h b/src/editWindows.h
index 5cb0a7c..25cf3ed 100644
--- a/src/editWindows.h
+++ b/src/editWindows.h
@@ -32,7 +32,7 @@ class EMenuWindow : public MyWindow {
   void draw();
   void mouseDown(int state, int x, int y);
   void openSubMenu(int);
-  void key(int key, int shift);
+  void key(int key, int shift, int x, int y);
 
   int keyToMenuEntry(int, int);
 
@@ -128,7 +128,7 @@ class ENewWindow : public MyWindow {
 
   void draw();
   void mouseDown(int state, int x, int y);
-  void key(int key, int x, int y);
+  void key(int key, int shift, int x, int y);
 
  private:
   char name[256];
diff --git a/src/flag.cc b/src/flag.cc
index 5b4c74d..19c6247 100644
--- a/src/flag.cc
+++ b/src/flag.cc
@@ -75,11 +75,10 @@ int Flag::generateBuffers(GLuint *&idxbufs, GLuint *&databufs) {
   GLfloat dby[5] = {0.1f, 0.2f, 0.2f, 0.2f, 0.1f};
   GLfloat color[4] = {primaryColor[0], primaryColor[1], primaryColor[2], 1.0};
   for (int i = 0; i < 5; i++) {
-    Coord3d b = {dbx[i], dby[i], 0.0};
-    Coord3d up = {0.0, 0.0, 1.0};
-    Coord3d normal;
-    crossProduct(up, b, normal);
-    normalize(normal);
+    Coord3d b(dbx[i], dby[i], 0.0);
+    Coord3d up(0.0, 0.0, 1.0);
+    Coord3d normal = crossProduct(up, b);
+    normal = normal / length(normal);
     GLfloat fnorm[3] = {(GLfloat)normal[0], (GLfloat)normal[1], (GLfloat)normal[2]};
     pos += packObjectVertex(pos, position[0] + dx[i], position[1] - 0.1 * i, position[2] + 0.7,
                             0., 0., color, fnorm);
@@ -121,7 +120,7 @@ void Flag::tick(Real /*t*/) {
   Player *p = Game::current->player1;
   Coord3d diff;
 
-  sub(position, p->position, diff);
+  diff = position - p->position;
   if (!visible) diff[2] = 0.0;
   if (length(diff) < p->radius + radius) onGet();
 }
diff --git a/src/forcefield.cc b/src/forcefield.cc
index 767897a..6b98545 100644
--- a/src/forcefield.cc
+++ b/src/forcefield.cc
@@ -29,8 +29,8 @@ void ForceField::reset() {
 }
 
 ForceField::ForceField(Coord3d pos, Coord3d dir, Real h, int a) : Animated() {
-  assign(pos, position);
-  assign(dir, direction);
+  position = pos;
+  direction = dir;
   height = h;
   allow = a;
   primaryColor[0] = 0.3;
@@ -57,10 +57,9 @@ int ForceField::generateBuffers(GLuint *&idxbufs, GLuint *&databufs) {
   if (!is_on) return 0;
   allocateBuffers(1, idxbufs, databufs);
 
-  Coord3d ndir;
-  assign(direction, ndir);
+  Coord3d ndir = direction;
   GLfloat len = length(ndir);
-  normalize(ndir);
+  ndir = ndir / length(ndir);
   // Bound edge width by available space
   GLfloat edge = std::min(std::abs(len), std::abs((GLfloat)height));
   edge = std::min(edge / 5, 0.03f);
diff --git a/src/fountain.cc b/src/fountain.cc
index bc11900..c8c0277 100644
--- a/src/fountain.cc
+++ b/src/fountain.cc
@@ -163,7 +163,7 @@ void Fountain::tick(Real t) {
     Player *p = Game::current->player1;
     Coord3d diff;
 
-    sub(position, p->position, diff);
+    diff = position - p->position;
     if (length(diff) < p->radius + 0.2) {
       for (i = 0; i < 3; i++)
         p->velocity[i] +=
diff --git a/src/game.cc b/src/game.cc
index 0c8ec6f..5f3234e 100644
--- a/src/game.cc
+++ b/src/game.cc
@@ -305,8 +305,7 @@ void Game::drawReflection(Coord3d focus) {
     Animated *anim = *i;
     anim->onScreen = 0;
 
-    double tmp[3];
-    sub(focus, anim->position, tmp);
+    Coord3d tmp = focus - anim->position;
     if (length(tmp) > 5.0) continue;
 
     anim->onScreen = testBboxClip(anim->position[0] + anim->boundingBox[0][0],
diff --git a/src/gamer.cc b/src/gamer.cc
index f4b5396..0c6e038 100644
--- a/src/gamer.cc
+++ b/src/gamer.cc
@@ -27,10 +27,10 @@
 #include "settings.h"
 
 #include <dirent.h>
-#include <stdlib.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <zlib.h>
+#include <cstdlib>
 
 Gamer::Gamer() {
   memset(name, 0, sizeof(name));
diff --git a/src/general.cc b/src/general.cc
index ac0fd92..6de94a7 100644
--- a/src/general.cc
+++ b/src/general.cc
@@ -22,12 +22,14 @@
 
 #include <dirent.h>
 #include <stdarg.h>
-#include <stdlib.h>
 #include <sys/stat.h>
 #include <time.h>
+#include <cstdlib>
 
 int low_memory;
 
+double timeDilationFactor = 1.0;
+
 void generalInit() {}
 
 double frandom() { return (rand() % (1 << 30)) / ((double)(1 << 30)); }
@@ -83,7 +85,8 @@ struct timespec getMonotonicTime() {
 }
 
 double getTimeDifference(const struct timespec &from, const struct timespec &to) {
-  return (to.tv_sec - from.tv_sec) + 1e-9 * (to.tv_nsec - from.tv_nsec);
+  double elapsed = (to.tv_sec - from.tv_sec) + 1e-9 * (to.tv_nsec - from.tv_nsec);
+  return timeDilationFactor * elapsed;
 }
 
 void error(const char *formatstr, ...) {
diff --git a/src/general.h b/src/general.h
index d70ca30..051fc75 100644
--- a/src/general.h
+++ b/src/general.h
@@ -19,6 +19,9 @@
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */
 
+#ifndef GENERAL_H
+#define GENERAL_H
+
 #include <libintl.h>
 #include <stdio.h>
 #include <cmath>
@@ -37,10 +40,52 @@ typedef unsigned char uchar;
 typedef unsigned short ushort;
 typedef unsigned long ulong;
 typedef double Real;
-typedef double Coord3d[3];
 typedef double Matrix4d[4][4];
 typedef double Matrix3d[3][3];
-typedef int Boolean;
+typedef int ICoord2d[2];
+
+// Simple vector type to make geometry code readable
+class Coord3d {
+ public:
+  inline Coord3d() {
+    data[0] = 0.;
+    data[1] = 0.;
+    data[2] = 0.;
+  }
+  inline Coord3d(double x[3]) {
+    data[0] = x[0];
+    data[1] = x[1];
+    data[2] = x[2];
+  }
+  inline Coord3d(double x, double y, double z) {
+    data[0] = x;
+    data[1] = y;
+    data[2] = z;
+  };
+  inline double &operator[](size_t idx) { return data[idx]; }
+  inline double operator[](size_t idx) const { return data[idx]; }
+  inline Coord3d operator+(const Coord3d &other) const {
+    return Coord3d(this->data[0] + other.data[0], this->data[1] + other.data[1],
+                   this->data[2] + other.data[2]);
+  }
+  inline Coord3d operator-(const Coord3d &other) const {
+    return Coord3d(this->data[0] - other.data[0], this->data[1] - other.data[1],
+                   this->data[2] - other.data[2]);
+  }
+  inline Coord3d operator-() const {
+    return Coord3d(-this->data[0], -this->data[1], -this->data[2]);
+  }
+  inline Coord3d operator*(double scale) const {
+    return Coord3d(this->data[0] * scale, this->data[1] * scale, this->data[2] * scale);
+  }
+  inline Coord3d operator/(double scale) const {
+    return Coord3d(this->data[0] / scale, this->data[1] / scale, this->data[2] / scale);
+  }
+
+ private:
+  double data[3];
+};
+inline Coord3d operator*(double scale, const Coord3d &vec) { return vec * scale; }
 
 #ifndef M_PI
 #define M_PI 3.14159265358979323846264
@@ -77,3 +122,5 @@ extern int low_memory;  // if true, attempt to conserve memory
 extern int debug_joystick;
 extern int repair_joystick;
 extern int theFrameNumber;
+
+#endif /*GENERAL_H*/
diff --git a/src/glHelp.cc b/src/glHelp.cc
index b534c22..781fc32 100644
--- a/src/glHelp.cc
+++ b/src/glHelp.cc
@@ -30,10 +30,9 @@
 
 #include <SDL2/SDL_image.h>
 #include <SDL2/SDL_ttf.h>
+#include <cstdlib>
 #include <map>
 
-#define SHADOW_TEXSIZE 512
-
 float fps = 50.0;
 int screenWidth = 640, screenHeight = 480;
 ViewParameters activeView;
@@ -49,6 +48,7 @@ GLuint theVao = 0;
 TTF_Font *ingameFont;
 extern struct timespec displayStartTime;
 extern struct timespec lastDisplayStartTime;
+extern double timeDilationFactor;
 
 const GLfloat menuColorSelected[4] = {0.86f, 0.86f, 0.86f, 1.f};
 const GLfloat menuColor[4] = {0.86f, 0.86f, 0.25f, 1.f};
@@ -73,10 +73,6 @@ ushort *sphere_idxs[MAX_BALL_DETAIL];
 static std::map<int, TTF_Font *> menuFontLookup;
 
 Sparkle2D *sparkle2D = NULL;
-/*
-SDL_Surface *mousePointer;
-GLuint mousePointerTexture;
-*/
 
 struct StringInfo {
   TTF_Font *font;
@@ -221,9 +217,9 @@ void tickMouse(Real td) {
 void draw2DRectangle(GLfloat x, GLfloat y, GLfloat w, GLfloat h, GLfloat tx, GLfloat ty,
                      GLfloat tw, GLfloat th, GLfloat r, GLfloat g, GLfloat b, GLfloat a,
                      GLuint tex) {
-  GLfloat corners[4][2] = {x, y, x, y + h, x + w, y, x + w, y + h};
-  GLfloat texture[4][2] = {tx, ty, tx, ty + th, tx + tw, ty, tx + tw, ty + th};
-  GLfloat colors[4][4] = {r, g, b, a, r, g, b, a, r, g, b, a, r, g, b, a};
+  GLfloat corners[4][2] = {{x, y}, {x, y + h}, {x + w, y}, {x + w, y + h}};
+  GLfloat texture[4][2] = {{tx, ty}, {tx, ty + th}, {tx + tw, ty}, {tx + tw, ty + th}};
+  GLfloat colors[4][4] = {{r, g, b, a}, {r, g, b, a}, {r, g, b, a}, {r, g, b, a}};
   draw2DQuad(corners, texture, colors, tex);
 }
 
@@ -281,7 +277,8 @@ void drawMouse(int x, int y, int w, int h) {
   GLfloat dx = 0.707f * w * r1 * std::sin(mousePointerPhase * 0.35);
   GLfloat dy = 0.707f * h * r2 * std::cos(mousePointerPhase * 0.35);
 
-  GLfloat colors[4][4] = {1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.};
+  GLfloat colors[4][4] = {
+      {1., 1., 1., 1.}, {1., 1., 1., 1.}, {1., 1., 1., 1.}, {1., 1., 1., 1.}};
   GLfloat texco[4][2] = {{0., 0.}, {0., 1.}, {1., 0.}, {1., 1.}};
 
   GLfloat vco[4][2] = {{x - dx, y - dy}, {x - dy, y + dx}, {x + dy, y - dx}, {x + dx, y + dy}};
@@ -491,16 +488,15 @@ void perspectiveMatrix(GLdouble fovy_deg, GLdouble aspect, GLdouble zNear, GLdou
 void lookAtMatrix(GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ, GLdouble centerX,
                   GLdouble centerY, GLdouble centerZ, GLdouble upX, GLdouble upY, GLdouble upZ,
                   Matrix4d out) {
-  Coord3d eye = {eyeX, eyeY, eyeZ};
-  Coord3d center = {centerX, centerY, centerZ};
-  Coord3d up = {upX, upY, upZ};
-  Coord3d f, s, u;
-  sub(center, eye, f);
-  normalize(f);
-  normalize(up);
-  crossProduct(f, up, s);
-  normalize(s);
-  crossProduct(s, f, u);
+  Coord3d eye(eyeX, eyeY, eyeZ);
+  Coord3d center(centerX, centerY, centerZ);
+  Coord3d up(upX, upY, upZ);
+  Coord3d f = center - eye;
+  f = f / length(f);
+  up = up / length(up);
+  Coord3d s = crossProduct(f, up);
+  s = s / length(s);
+  Coord3d u = crossProduct(s, f);
 
   Matrix4d mat = {{s[0], u[0], -f[0], 0.},
                   {s[1], u[1], -f[1], 0.},
@@ -530,9 +526,8 @@ void setViewUniforms(GLuint shader) {
   glUniform1f(glGetUniformLocation(shader, "fog_start"), activeView.fog_start);
   glUniform1f(glGetUniformLocation(shader, "fog_end"), activeView.fog_end);
 
-  glUniform3f(glGetUniformLocation(shader, "light_position"),
-              (GLfloat)activeView.light_position[0], (GLfloat)activeView.light_position[1],
-              (GLfloat)activeView.light_position[2]);
+  glUniform3f(glGetUniformLocation(shader, "light_position"), activeView.light_position[0],
+              activeView.light_position[1], activeView.light_position[2]);
   glUniform3f(glGetUniformLocation(shader, "light_ambient"), activeView.light_ambient[0],
               activeView.light_ambient[1], activeView.light_ambient[2]);
   glUniform3f(glGetUniformLocation(shader, "light_diffuse"), activeView.light_diffuse[0],
@@ -586,7 +581,7 @@ void setViewUniforms(GLuint shader) {
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
   glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 
-  int N = 3;
+  const int N = 3;
   GLfloat cscproj[N * 16], cscmodel[N * 16];
   for (int i = 0; i < N; i++) {
     for (int j = 0; j < 4; j++) {
@@ -634,7 +629,9 @@ void renderShadowMap(Coord3d focus, Map *mp, Game *gm) {
   assign(activeView.projection, origProj);
 
   activeView.calculating_shadows = 1;
-  if (activeView.shadowMapTexsize <= 1) {
+  static int ltexsize = 0;
+  if (activeView.shadowMapTexsize <= 1 || ltexsize != Settings::settings->shadowTexsize) {
+    ltexsize = Settings::settings->shadowTexsize;
     /* order doesn't matter */
     GLenum dirs[6] = {GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
                       GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
@@ -642,15 +639,16 @@ void renderShadowMap(Coord3d focus, Map *mp, Game *gm) {
 
     GLint maxSize;
     glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize);
-    activeView.shadowMapTexsize = std::min(maxSize, SHADOW_TEXSIZE);
+    GLint reqSize = 1 << Settings::settings->shadowTexsize;
+    activeView.shadowMapTexsize = std::min(maxSize, reqSize);
     for (uint face = 0; face < 6; face++) {
       glTexImage2D(dirs[face], 0, GL_DEPTH_COMPONENT, activeView.shadowMapTexsize,
                    activeView.shadowMapTexsize, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
     }
   }
 
-  Coord3d norv[6] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
-  Coord3d upv[6] = {{0, -1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}, {0, -1, 0}, {0, -1, 0}};
+  GLdouble norv[6][3] = {{1, 0, 0}, {-1, 0, 0}, {0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}};
+  GLdouble upv[6][3] = {{0, -1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}, {0, -1, 0}, {0, -1, 0}};
   /* order doesn't matter */
   GLenum dirs[6] = {GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
                     GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
@@ -707,7 +705,7 @@ void mulMatrix4(const Matrix4d mult, const double src[4], double res[4]) {
   for (int i = 0; i < 4; i++) {
     for (int j = 0; j < 4; j++) { r[i] += src[j] * mult[i][j]; }
   }
-  assign(r, res);
+  for (int i = 0; i < 4; i++) { res[i] = r[i]; }
 }
 
 void renderShadowCascade(Coord3d focus, Map *mp, Game *gm) {
@@ -734,10 +732,8 @@ void renderShadowCascade(Coord3d focus, Map *mp, Game *gm) {
   Matrix3d mvm3t;
   for (int k = 0; k < 3; k++)
     for (int j = 0; j < 3; j++) mvm3t[j][k] = mvmt[k][j];
-  Coord3d cc = {mvmt[0][3], mvmt[1][3], mvmt[2][3]};
-  Coord3d camera;
-  useMatrix(mvm3t, cc, camera);
-  for (int k = 0; k < 3; k++) camera[k] *= -1;
+  Coord3d cc(mvmt[0][3], mvmt[1][3], mvmt[2][3]);
+  Coord3d camera = -useMatrix(mvm3t, cc);
 
   Matrix4d light_align;
   lookAtMatrix(0, 0, 0, activeView.sun_direction[0], activeView.sun_direction[1],
@@ -755,15 +751,12 @@ void renderShadowCascade(Coord3d focus, Map *mp, Game *gm) {
                           aspect * std::tan(proj_half_angle) * dts[i + j], dts[i + j]};
       for (int k = 0; k < 4; k++) {
         eyepts[k % 2] *= -1;
-        double resultA[3];
         /* convert to world space */
-        useMatrix(mvm3t, eyepts, resultA);
-        for (int m = 0; m < 3; m++) resultA[m] += camera[m];
+        Coord3d resultA = useMatrix(mvm3t, eyepts) + camera;
 
-        double result[3];
         /* reorient along light space. NOTE: this breaks total offset, but we don't care about
          * it...*/
-        useMatrix(light_align3, resultA, result);
+        Coord3d result = useMatrix(light_align3, resultA);
 
         for (int m = 0; m < 3; m++) {
           bounds[m][0] = std::min(bounds[m][0], result[m]);
@@ -774,15 +767,13 @@ void renderShadowCascade(Coord3d focus, Map *mp, Game *gm) {
     double dx = bounds[0][1] - bounds[0][0], dy = bounds[1][1] - bounds[1][0];  //,
     double rx = std::max(dx, dy);
     double ry = std::max(dx, dy);
-    double midpoint[3] = {0, 0, -0.5 * (dts[i] + dts[i + 1])};
-    double mmpt[3];
-    useMatrix(mvm3t, midpoint, mmpt);
-    for (int k = 0; k < 3; k++) mmpt[k] += camera[k];
+    Coord3d midpoint(0, 0, -0.5 * (dts[i] + dts[i + 1]));
+    Coord3d mmpt = useMatrix(mvm3t, midpoint) + camera;
 
     double s = 50; /* rel. the 100 of range */
-    Coord3d light_camera = {mmpt[0] - s * activeView.sun_direction[0],
-                            mmpt[1] - s * activeView.sun_direction[1],
-                            mmpt[2] - s * activeView.sun_direction[2]};
+    Coord3d sundir(activeView.sun_direction[0], activeView.sun_direction[1],
+                   activeView.sun_direction[2]);
+    Coord3d light_camera = mmpt - s * sundir;
     lookAtMatrix(light_camera[0], light_camera[1], light_camera[2], mmpt[0], mmpt[1], mmpt[2],
                  0, 0, 1, activeView.cascade_model[i]);
 
@@ -794,11 +785,14 @@ void renderShadowCascade(Coord3d focus, Map *mp, Game *gm) {
   }
 
   /* Render cascade map using the given matrices */
-  if (activeView.cascadeTexsize <= 1) {
+  static int ltexsize = 0;
+  if (activeView.cascadeTexsize <= 1 || ltexsize != Settings::settings->shadowTexsize) {
+    ltexsize = Settings::settings->shadowTexsize;
     /* order doesn't matter */
     GLint maxSize;
     glGetIntegerv(GL_MAX_TEXTURE_SIZE, &maxSize);
-    activeView.cascadeTexsize = std::min(maxSize, SHADOW_TEXSIZE);
+    GLint reqSize = 1 << Settings::settings->shadowTexsize;
+    activeView.cascadeTexsize = std::min(maxSize, reqSize);
   }
   for (int i = 0; i < N; i++) {
     glBindTexture(GL_TEXTURE_2D, activeView.cascadeTexture[i]);
@@ -850,7 +844,7 @@ void renderShadowCascade(Coord3d focus, Map *mp, Game *gm) {
 int createSnapshot() {
   static int snap_number = 0;
   char name[1024];
-  int again = 9999, i, j;
+  int again = 9999;
   FILE *f;
 
   /* find the name for the image */
@@ -1225,7 +1219,6 @@ int resetTextures() {
   GLfloat texCoord[4];
   char str[256];
   SDL_Surface *surface;
-  int linear = 0;
 
   for (int i = 0; i < numTextures; i++) {
     if (textureNames[i] == NULL) continue;
@@ -1246,7 +1239,7 @@ int resetTextures() {
 /* Calculates and displays current framerate */
 void displayFrameRate() {
   /* Frame rate is given for the previous period. */
-  double td = getTimeDifference(lastDisplayStartTime, displayStartTime);
+  double td = getTimeDifference(lastDisplayStartTime, displayStartTime) / timeDilationFactor;
   if (td > 1.0)
     fps = 1.0;
   else if (td <= 1e-4) {
@@ -1293,7 +1286,8 @@ void matrixMult(const Matrix4d A, const Matrix4d B, Matrix4d C) {
 }
 
 /* C <- A(B) */
-void useMatrix(Matrix4d A, const double B[3], double C[3]) {
+Coord3d useMatrix(Matrix4d A, const Coord3d &B) {
+  Coord3d C;
   for (int i = 0; i < 3; i++) {
     C[i] = A[i][3];
     for (int k = 0; k < 3; k++) C[i] += A[i][k] * B[k];
@@ -1301,14 +1295,16 @@ void useMatrix(Matrix4d A, const double B[3], double C[3]) {
   double h = A[3][3];
   for (int k = 0; k < 3; k++) h += A[3][k];
   for (int k = 0; k < 3; k++) C[k] /= h;
+  return C;
 }
 
 /* C <- A(B) */
-void useMatrix(Matrix3d A, const double B[3], double C[3]) {
+Coord3d useMatrix(Matrix3d A, const Coord3d &B) {
+  Coord3d C;
   for (int i = 0; i < 3; i++) {
-    C[i] = 0.;
     for (int k = 0; k < 3; k++) C[i] += A[i][k] * B[k];
   }
+  return C;
 }
 
 /* C <- A */
@@ -1318,19 +1314,6 @@ void assign(const Matrix4d A, Matrix4d C) {
 }
 
 /* C <- A */
-void assign(const double A[3], double C[3]) {
-  C[0] = A[0];
-  C[1] = A[1];
-  C[2] = A[2];
-}
-
-/* C <- A */
-void assign(const float A[3], float C[3]) {
-  C[0] = A[0];
-  C[1] = A[1];
-  C[2] = A[2];
-}
-
 void identityMatrix(Matrix4d m) {
   for (int i = 0; i < 4; i++)
     for (int j = 0; j < 4; j++) m[i][j] = i == j ? 1.0 : 0.0;
@@ -1363,8 +1346,6 @@ void rotateZ(double v, Matrix4d m) {
   assign(m, morig);
   matrixMult(morig, mr, m);
 }
-void zero(double v[3]) { v[0] = v[1] = v[2] = 0.0; }
-
 int testBboxClip(double x1, double x2, double y1, double y2, double z1, double z2,
                  const Matrix4d model, const Matrix4d proj) {
   // Construct axis-aligned bounding box in window space
diff --git a/src/glHelp.h b/src/glHelp.h
index 425f17d..672329d 100644
--- a/src/glHelp.h
+++ b/src/glHelp.h
@@ -26,7 +26,6 @@
 #include <GL/glext.h>
 
 #include "general.h"
-#include "math.h"
 
 typedef struct _TTF_Font TTF_Font;
 typedef struct SDL_Surface SDL_Surface;
@@ -86,7 +85,7 @@ typedef struct _viewpa {
   GLfloat fog_start;
   GLfloat fog_end;
 
-  Coord3d light_position;
+  GLfloat light_position[3];
   GLfloat light_ambient[3];
   GLfloat light_diffuse[3];
   GLfloat light_specular[3];
@@ -125,25 +124,22 @@ void message(char *row1, char *row2);
 void multiMessage(int nlines, const char *left[], const char *right[]);
 void displayFrameRate();
 
-void assign(const float[3], float[3]);
-void assign(const double[3], double[3]);
-void crossProduct(const double[3], const double[3], double[3]);
-double dotProduct(const double[3], const double[3]);
-void add(const double[3], const double[3], double[3]);
-void sub(const double[3], const double[3], double[3]);
-void normalize(double[3]);
-double length(double[3]);
-void zero(double[3]);
+Coord3d crossProduct(const Coord3d &, const Coord3d &);
+double dotProduct(const Coord3d &, const Coord3d &);
+double length(const Coord3d &);
 
 void debugMatrix(Matrix4d);
-void useMatrix(Matrix4d, const double[3], double[3]);
-void useMatrix(Matrix3d, const double[3], double[3]);
+Coord3d useMatrix(Matrix4d, const Coord3d &);
+Coord3d useMatrix(Matrix3d, const Coord3d &);
 void identityMatrix(Matrix4d);
 void assign(const Matrix4d, Matrix4d);
 void matrixMult(const Matrix4d, const Matrix4d, Matrix4d);
 void rotateX(double, Matrix4d);
 void rotateY(double, Matrix4d);
 void rotateZ(double, Matrix4d);
+inline void assign(const GLfloat A[3], GLfloat B[3]) {
+  for (int k = 0; k < 3; k++) B[k] = A[k];
+}
 int powerOfTwo(int input);
 int testBboxClip(double x1, double x2, double y1, double y2, double z1, double z2,
                  const Matrix4d model, const Matrix4d proj);
@@ -174,33 +170,21 @@ extern const GLfloat menuColorSelected[4], menuColor[4];
 /***********************************/
 /*  Inlined vector operations      */
 
-/* C <- A + B */
-inline void add(const double A[3], const double B[3], double C[3]) {
-  for (int i = 0; i < 3; i++) C[i] = A[i] + B[i];
-}
-
-/* C <- A - B */
-inline void sub(const double A[3], const double B[3], double C[3]) {
-  for (int i = 0; i < 3; i++) C[i] = A[i] - B[i];
-}
-/* C <- C * 1 / |C| */
-inline void normalize(double C[3]) {
-  double l = sqrt(C[0] * C[0] + C[1] * C[1] + C[2] * C[2]);
-  C[0] /= l;
-  C[1] /= l;
-  C[2] /= l;
-}
 /* |A| */
-inline double length(double A[3]) { return sqrt(A[0] * A[0] + A[1] * A[1] + A[2] * A[2]); }
+inline double length(const Coord3d &A) {
+  return std::sqrt(A[0] * A[0] + A[1] * A[1] + A[2] * A[2]);
+}
 /* C <- A x B */
-inline void crossProduct(const double A[3], const double B[3], double C[3]) {
+inline Coord3d crossProduct(const Coord3d &A, const Coord3d &B) {
+  Coord3d C;
   C[0] = A[1] * B[2] - A[2] * B[1];
   C[1] = A[2] * B[0] - A[0] * B[2];
   C[2] = A[0] * B[1] - A[1] * B[0];
+  return C;
 }
 
 /* <- A . B */
-inline double dotProduct(const double A[3], const double B[3]) {
+inline double dotProduct(const Coord3d &A, const Coord3d &B) {
   return A[0] * B[0] + A[1] * B[1] + A[2] * B[2];
 }
 #endif
diff --git a/src/goal.cc b/src/goal.cc
index 02a6c24..e038b97 100644
--- a/src/goal.cc
+++ b/src/goal.cc
@@ -25,7 +25,7 @@
 #include "player.h"
 
 Goal::Goal(Real x, Real y, int rotate, char *nextLevel) : Flag(x, y, 1000, 1, 0.2) {
-  strcpy(this->nextLevel, nextLevel);
+  strncpy(this->nextLevel, nextLevel, sizeof(this->nextLevel));
   this->rotate = rotate;
   primaryColor[0] = 0.9;
   primaryColor[1] = 0.8;
@@ -37,7 +37,7 @@ Goal::Goal(Real x, Real y, int rotate, char *nextLevel) : Flag(x, y, 1000, 1, 0.
 void Goal::onGet() {
   // TODO. Make sure player is entering the goal from the right direction
   if (!Game::current->player1->hasWon) {
-    strcpy(Game::current->nextLevel, nextLevel);
+    strncpy(Game::current->nextLevel, nextLevel, sizeof(Game::current->nextLevel));
     if (Game::current->map->isBonus)
       MainMode::mainMode->bonusLevelComplete();
     else
diff --git a/src/guile.cc b/src/guile.cc
index df321c9..71510b9 100644
--- a/src/guile.cc
+++ b/src/guile.cc
@@ -54,6 +54,7 @@
 #include "weather.h"
 
 #include <zlib.h>
+#include <cstdlib>
 
 /* Object coordinates are shifted by DX/DY relative to map coordinates in the API
  * Thus, a flag, ball, etc. placed at (222,225) will appear at (222+DX,225+DY)
@@ -205,7 +206,17 @@ char *ascm_format(const char *str) {
 }
 
 /******************** _ a.k.a. gettext  ********************/
-SCM_DEFINE(underscore, "_", 1, 0, 0, (SCM str), "Translate string if translation available")
+SCM_DEFINE(underscore, "_", 1, 0, 0, (SCM str),
+           "Mark string visible for translation and return it (see 'translate')")
+#define FUNC_NAME s_underscore
+{
+  SCM_ASSERT(scm_is_string(str), str, SCM_ARG1, FUNC_NAME);
+  return str;
+}
+#undef FUNC_NAME
+
+SCM_DEFINE(translate_string, "translate", 1, 0, 0, (SCM str),
+           "Translate string argument if possible (see '_')")
 #define FUNC_NAME s_underscore
 {
   SCM_ASSERT(scm_is_string(str), str, SCM_ARG1, FUNC_NAME);
@@ -214,6 +225,7 @@ SCM_DEFINE(underscore, "_", 1, 0, 0, (SCM str), "Translate string if translation
   SCM out = scm_from_utf8_string(trans);
   free(text);
   return out;
+  return out;
 }
 #undef FUNC_NAME
 
@@ -433,7 +445,8 @@ SCM_DEFINE(add_goal, "add-goal", 4, 0, 0, (SCM x, SCM y, SCM rotate, SCM nextLev
 /************* sign ************/
 SCM_DEFINE(sign, "sign", 6, 1, 0,
            (SCM text, SCM scale, SCM rotation, SCM duration, SCM x, SCM y, SCM z),
-           "Creates a new sign. duration<0 lasts forever. Returns an 'animated' object")
+           "Creates a new sign. Text is translated if possible. duration<0 lasts forever. "
+           "Returns an 'animated' object")
 #define FUNC_NAME s_sign
 {
   SCM_ASSERT(scm_is_string(text), text, SCM_ARG1, FUNC_NAME);
@@ -447,7 +460,7 @@ SCM_DEFINE(sign, "sign", 6, 1, 0,
         pos[2] = scm_to_double(z);
       else
         pos[2] = Game::current->map->getHeight(pos[0], pos[1]) + 2.0;
-      Sign *s = new Sign(sname, scm_to_double(duration), scm_to_double(scale),
+      Sign *s = new Sign(gettext(sname), scm_to_double(duration), scm_to_double(scale),
                          scm_to_double(rotation), pos);
       free(sname);
       return smobAnimated_make(s);
@@ -1298,6 +1311,22 @@ SCM_DEFINE(set_cell_flag, "set-cell-flag", 6, 0, 0,
 }
 #undef FUNC_NAME
 
+/************** get-cell-flag ************/
+SCM_DEFINE(get_cell_flag, "get-cell-flag", 3, 0, 0, (SCM x, SCM y, SCM flag),
+           "Checks if a cell flag is active")
+#define FUNC_NAME s_get_cell_flag
+{
+  SCM_ASSERT(scm_is_integer(x), x, SCM_ARG1, FUNC_NAME);
+  SCM_ASSERT(scm_is_integer(y), y, SCM_ARG2, FUNC_NAME);
+  SCM_ASSERT(scm_is_integer(flag), flag, SCM_ARG5, FUNC_NAME);
+  Cell &c = Game::current->map->cell(scm_to_int(x), scm_to_int(y));
+  if (c.flags & scm_to_int(flag))
+    return SCM_BOOL_T;
+  else
+    return SCM_BOOL_F;
+}
+#undef FUNC_NAME
+
 /************** set-cell-velocity ************/
 SCM_DEFINE(set_cell_velocity, "set-cell-velocity", 6, 0, 0,
            (SCM x0, SCM y0, SCM x1, SCM y1, SCM vx, SCM vy), "Modifies the velocity of a cell")
diff --git a/src/heightModifier.cc b/src/heightModifier.cc
index 1d0eca9..0df8d88 100644
--- a/src/heightModifier.cc
+++ b/src/heightModifier.cc
@@ -131,12 +131,18 @@ void HeightModifier::tick(Real /*t*/) {
   if ((cor2 != not1) && (cor2 != not2) && (cor2 != not3)) c2.heights[cor2] = v;
   if ((cor3 != not1) && (cor3 != not2) && (cor3 != not3)) c3.heights[cor3] = v;
 
+  if (avg_center) {
+    c.heights[4] = (c.heights[0] + c.heights[1] + c.heights[2] + c.heights[3]) / 4.;
+    if ((cor1 != not1) && (cor1 != not2) && (cor1 != not3))
+      c1.heights[4] = (c1.heights[0] + c1.heights[1] + c1.heights[2] + c1.heights[3]) / 4.;
+    if ((cor2 != not1) && (cor2 != not2) && (cor2 != not3))
+      c2.heights[4] = (c2.heights[0] + c2.heights[1] + c2.heights[2] + c2.heights[3]) / 4.;
+    if ((cor3 != not1) && (cor3 != not2) && (cor3 != not3))
+      c3.heights[4] = (c3.heights[0] + c3.heights[1] + c3.heights[2] + c3.heights[3]) / 4.;
+  }
+
   Game::current->map->markCellsUpdated(x, y, x, y, 1);
   Game::current->map->markCellsUpdated(x1, y1, x1, y1, 1);
   Game::current->map->markCellsUpdated(x2, y2, x2, y2, 1);
   Game::current->map->markCellsUpdated(x3, y3, x3, y3, 1);
-
-  if (avg_center) {
-    c.heights[4] = (c.heights[0] + c.heights[1] + c.heights[2] + c.heights[3]) / 4.;
-  }
 }
diff --git a/src/helpMode.cc b/src/helpMode.cc
index 927a806..d255c98 100644
--- a/src/helpMode.cc
+++ b/src/helpMode.cc
@@ -126,7 +126,7 @@ void HelpMode::display() {
   GLfloat sunLight[3] = {0.8, 0.8, 0.8};
   GLfloat ambient[3] = {0.2, 0.2, 0.2};
   GLfloat black[3] = {0.2, 0.2, 0.2};
-  Coord3d lightPosition = {-100., -100., 150.};
+  GLfloat lightPosition[3] = {-100., -100., 150.};
   assign(sunLight, activeView.light_diffuse);
   assign(sunLight, activeView.light_specular);
   assign(lightPosition, activeView.light_position);
@@ -140,10 +140,10 @@ void HelpMode::display() {
 
   /* Setup matrixes for the camera perspective */
   GLdouble step = 16.;
-  Coord3d cameraFrom1 = {0. + step * page, 0., -1.};
-  Coord3d cameraTo1 = {5. + step * page, 5., -8.};
-  Coord3d cameraFrom2 = {0. + step * page, 0. + step, -1.};
-  Coord3d cameraTo2 = {5. + step * page, 5. + step, -8.};
+  Coord3d cameraFrom1(0. + step * page, 0., -1.);
+  Coord3d cameraTo1(5. + step * page, 5., -8.);
+  Coord3d cameraFrom2(0. + step * page, 0. + step, -1.);
+  Coord3d cameraTo2(5. + step * page, 5. + step, -8.);
   lookAtMatrix(cameraFrom1[0], cameraFrom1[1], cameraFrom1[2], cameraTo1[0], cameraTo1[1],
                cameraTo1[2], 0.0, 0.0, 1.0, activeView.modelview);
   activeView.day_mode = 1;
diff --git a/src/highScore.cc b/src/highScore.cc
index 1d6214b..f9e86ce 100644
--- a/src/highScore.cc
+++ b/src/highScore.cc
@@ -28,6 +28,7 @@
 
 #include <libguile.h>
 #include <zlib.h>
+#include <cstdlib>
 
 char highScorePath[256];
 
@@ -36,7 +37,8 @@ HighScore::HighScore() {
   for (int levelSet = 0; levelSet < Settings::settings->nLevelSets; levelSet++)
     for (int i = 0; i < 10; i++) {
       points[levelSet][i] = 1000 - i * 100;
-      snprintf(names[levelSet][i], sizeof(names[levelSet][i]), _("Anonymous Coward"));
+      dummy_player[levelSet][i] = 1;
+      memset(names[levelSet][i], 0, sizeof(names[levelSet][i]));
     }
 
 #ifdef ALT_HIGHSCORES
@@ -95,16 +97,23 @@ HighScore::HighScore() {
     for (int i = 0; i < 10; i++) {
       SCM cell = scm_list_ref(block, scm_from_int32(i + 1));
       if (!scm_to_bool(scm_list_p(cell)) || scm_to_int(scm_length(cell)) != 2 ||
-          !scm_is_string(SCM_CAR(cell)) || !scm_is_integer(SCM_CADR(cell)) ||
-          scm_to_int32(scm_string_length(SCM_CAR(cell))) >= 25) {
+          !((scm_is_string(SCM_CAR(cell)) &&
+             scm_to_int32(scm_string_length(SCM_CAR(cell))) < 25) ||
+            scm_is_false(SCM_CAR(cell))) ||
+          !scm_is_integer(SCM_CADR(cell))) {
         scm_close_input_port(ip);
         warning("Incorrect format for highscore file %s", highScorePath);
         return;
       }
-      char* lname = scm_to_utf8_string(SCM_CAR(cell));
-      strncpy(&names[levelSet][i][0], lname, 25);
-      free(lname);
-      points[levelSet][i] = scm_to_int32(SCM_CADR(cell));
+      if (scm_is_false(SCM_CAR(cell))) {
+        dummy_player[levelSet][i] = 1;
+      } else {
+        char* lname = scm_to_utf8_string(SCM_CAR(cell));
+        strncpy(&names[levelSet][i][0], lname, 25);
+        free(lname);
+        points[levelSet][i] = scm_to_int32(SCM_CADR(cell));
+        dummy_player[levelSet][i] = 0;
+      }
     }
   }
   scm_close_input_port(ip);
@@ -123,11 +132,13 @@ void HighScore::addHighScore(int score, char* name) {
     if (score > points[levelSet][i]) break;
   if (i < 10) {
     for (int j = 9; j > i; j--) {
-      strcpy(names[levelSet][j], names[levelSet][j - 1]);
+      strncpy(names[levelSet][j], names[levelSet][j - 1], sizeof(names[levelSet][j]));
       points[levelSet][j] = points[levelSet][j - 1];
+      dummy_player[levelSet][j] = dummy_player[levelSet][j - 1];
     }
-    strcpy(names[levelSet][i], name);
+    strncpy(names[levelSet][i], name, sizeof(names[levelSet][i]));
     points[levelSet][i] = score;
+    dummy_player[levelSet][i] = 0;
   }
 
   if (pathIsLink(highScorePath)) {
@@ -147,9 +158,13 @@ void HighScore::addHighScore(int score, char* name) {
     gzprintf(gp, "(%s\n", lsname);
     free(lsname);
     for (int i = 0; i < 10; i++) {
-      char* recname = ascm_format(&names[levelSet][i][0]);
-      gzprintf(gp, "  (%s %d)\n", recname, points[levelSet][i]);
-      free(recname);
+      if (dummy_player[levelSet][i]) {
+        gzprintf(gp, "  (#f %d)\n", points[levelSet][i]);
+      } else {
+        char* recname = ascm_format(&names[levelSet][i][0]);
+        gzprintf(gp, "  (%s %d)\n", recname, points[levelSet][i]);
+        free(recname);
+      }
     }
     gzprintf(gp, ")\n");
   }
diff --git a/src/highScore.h b/src/highScore.h
index b1ac9fd..8ec0eea 100644
--- a/src/highScore.h
+++ b/src/highScore.h
@@ -30,6 +30,7 @@ class HighScore {
 
   int points[256][10];
   char names[256][10][25];
+  int dummy_player[256][10];
 
   int isHighScore(int points); /* returns true if this is a highscore */
   void addHighScore(int points, char *name);
diff --git a/src/hofMode.cc b/src/hofMode.cc
index 5010b0f..ad9055e 100644
--- a/src/hofMode.cc
+++ b/src/hofMode.cc
@@ -96,8 +96,11 @@ void HallOfFameMode::display() {
   HighScore *highscore = HighScore::highScore;
 
   for (int i = 0; i < 10; i++) {
-    Font::drawSimpleText(&highscore->names[levelSet][i][0], border, y + dy * i - fontSize,
-                         fontSize, menuColor[0], menuColor[1], menuColor[2], menuColor[3]);
+    const char *name = highscore->dummy_player[levelSet][i]
+                           ? _("Anonymous Coward")
+                           : &highscore->names[levelSet][i][0];
+    Font::drawSimpleText(name, border, y + dy * i - fontSize, fontSize, menuColor[0],
+                         menuColor[1], menuColor[2], menuColor[3]);
     snprintf(str, sizeof(str), _("%d points"), highscore->points[levelSet][i]);
     Font::drawRightSimpleText(str, screenWidth - border, y + dy * i - fontSize, fontSize,
                               menuColor[0], menuColor[1], menuColor[2], menuColor[3]);
diff --git a/src/mainMode.cc b/src/mainMode.cc
index e9422fb..d823719 100644
--- a/src/mainMode.cc
+++ b/src/mainMode.cc
@@ -35,13 +35,13 @@
 #include <SDL2/SDL_keyboard.h>
 #include <SDL2/SDL_keycode.h>
 #include <SDL2/SDL_mouse.h>
-#include <stdlib.h>
 #include <string.h>
+#include <cstdlib>
 
 #define ENVIRONMENT_TEXTURE_SIZE 512
 
-Coord3d sunPosition = {-20, -40, 40};
-Coord3d moonPosition = {0, 0, 2};
+Coord3d sunPosition(-20, -40, 40);
+Coord3d moonPosition(0, 0, 2);
 
 const int MainMode::statusBeforeGame = 0, MainMode::statusGameOver = 1,
           MainMode::statusInGame = 2;
@@ -61,8 +61,8 @@ MainMode::MainMode() {
   wantedZAngle = 0.;
   xyAngle = 0.;
   wantedXYAngle = 0.;
-  memset(camFocus, 0, sizeof(camFocus));
-  memset(camDelta, 0, sizeof(camDelta));
+  camFocus = Coord3d();
+  camDelta = Coord3d();
   gameStatus = 0;
   statusCount = 0.;
   time = 0.;
@@ -98,11 +98,8 @@ void MainMode::display() {
 
   } else {
     double angle = xyAngle * M_PI / 2. + M_PI / 4.;
-    Coord3d up;
-    up[0] = sin(angle) * zAngle;
-    up[1] = cos(angle) * zAngle;
-    up[2] = 1.0 - zAngle;
-    normalize(up);
+    Coord3d up(sin(angle) * zAngle, cos(angle) * zAngle, 1.0 - zAngle);
+    up = up / length(up);
     lookAtMatrix(camFocus[0] - 10. * sin(angle) * cos(zAngle * M_PI / 2.),
                  camFocus[1] - 10. * cos(angle) * cos(zAngle * M_PI / 2.),
                  10.0 + camFocus[2] * 0.5 + (10.0 + camFocus[2]) * sin(zAngle * M_PI / 2.),
@@ -176,9 +173,17 @@ void MainMode::display() {
     {
       const char *lp[3], *rp[3];
       lp[0] = _("Track:");
-      rp[0] = Game::current->map->mapname;
+      if (strlen(Game::current->map->mapname)) {
+        rp[0] = gettext(Game::current->map->mapname);
+      } else {
+        rp[0] = _("Unknown track");
+      }
       lp[1] = _("Author:");
-      rp[1] = Game::current->map->author;
+      if (strlen(Game::current->map->author)) {
+        rp[1] = Game::current->map->author;
+      } else {
+        rp[1] = _("Unknown author");
+      }
       lp[2] = _("Press spacebar to begin");
       rp[2] = " ";
       multiMessage(3, lp, rp);
@@ -505,8 +510,8 @@ void MainMode::idle(Real td) {
 void MainMode::activated() {
   zAngle = wantedZAngle = 0.0;
   xyAngle = wantedXYAngle = 0.0;
-  zero(camFocus);
-  zero(camDelta);
+  camFocus = Coord3d();
+  camDelta = Coord3d();
   gameStatus = statusBeforeGame;
   SDL_SetRelativeMouseMode(SDL_TRUE);
 
@@ -534,8 +539,7 @@ void MainMode::startGame() {
   gameStatus = statusInGame;
   Game::current->player1->hasWon = 0;
   playEffect(SFX_START);
-  Coord3d pos;
-  assign(Game::current->map->startPosition, pos);
+  Coord3d pos = Game::current->map->startPosition;
   Game::current->gamer->levelStarted();
 
   pos[2] += 2.0;
@@ -552,8 +556,7 @@ void MainMode::restartPlayer() {
   camFocus[1] = Game::current->map->startPosition[1];
   Game::current->gamer->levelStarted();
 
-  Coord3d pos;
-  assign(Game::current->map->startPosition, pos);
+  Coord3d pos = Game::current->map->startPosition;
   pos[2] += 2.0;
   new Sign(_("Good luck!"), 7, 1.0, 60.0, pos);
   player1->triggerHook(GameHookEvent_Spawn, NULL);
@@ -666,7 +669,8 @@ void MainMode::showBonus() {
 }
 void MainMode::bonusLevelComplete() {
   gameStatus = statusBonusLevelComplete;
-  strcpy(Game::current->nextLevel, Game::current->returnLevel);
+  strncpy(Game::current->nextLevel, Game::current->returnLevel,
+          sizeof(Game::current->nextLevel));
 }
 
 void MainMode::renderEnvironmentTexture(GLuint texture, Coord3d focus) const {
@@ -687,11 +691,8 @@ void MainMode::renderEnvironmentTexture(GLuint texture, Coord3d focus) const {
   /* Setup openGL matrixes for the camera perspective */
   double angle = xyAngle * M_PI / 2. + M_PI / 4.;
   // TODO. Fixme. This computation is wrong when zAngle > 0.0 !!
-  Coord3d up;
-  up[0] = sin(angle) * zAngle;
-  up[1] = cos(angle) * zAngle;
-  up[2] = 1.0 - zAngle;
-  normalize(up);
+  Coord3d up(sin(angle) * zAngle, cos(angle) * zAngle, 1.0 - zAngle);
+  up = up / length(up);
   lookAtMatrix(focus[0], focus[1], focus[2] + 0.0,
                focus[0] - 10. * sin(angle) * cos(zAngle * M_PI / 2.),
                focus[1] - 10. * cos(angle) * cos(zAngle * M_PI / 2.),
@@ -754,10 +755,11 @@ void MainMode::renderEnvironmentTexture(GLuint texture, Coord3d focus) const {
 void MainMode::setupLighting() const {
   GLfloat black[] = {0.0, 0.0, 0.0, 1.0};
   if (Game::current && Game::current->isNight) {
-    GLfloat lightDiffuse2[] = {0.9, 0.9, 0.9, 1.0};
-    Coord3d lightPosition2 = {Game::current->player1->position[0] + moonPosition[0],
-                              Game::current->player1->position[1] + moonPosition[1],
-                              Game::current->player1->position[2] + moonPosition[2]};
+    GLfloat lightDiffuse2[3] = {0.9, 0.9, 0.9};
+    GLfloat lightPosition2[3] = {
+        (GLfloat)(Game::current->player1->position[0] + moonPosition[0]),
+        (GLfloat)(Game::current->player1->position[1] + moonPosition[1]),
+        (GLfloat)(Game::current->player1->position[2] + moonPosition[2])};
     assign(lightDiffuse2, activeView.light_diffuse);
     assign(lightDiffuse2, activeView.light_specular);
     assign(lightPosition2, activeView.light_position);
@@ -767,9 +769,10 @@ void MainMode::setupLighting() const {
   } else {
     GLfloat sunLight[3] = {0.8, 0.8, 0.8};
     GLfloat ambient[3] = {0.2, 0.2, 0.2};
-    Coord3d lightPosition = {Game::current->player1->position[0] + sunPosition[0],
-                             Game::current->player1->position[1] + sunPosition[1],
-                             Game::current->player1->position[2] + sunPosition[2]};
+    GLfloat lightPosition[3] = {
+        (GLfloat)(Game::current->player1->position[0] + sunPosition[0]),
+        (GLfloat)(Game::current->player1->position[1] + sunPosition[1]),
+        (GLfloat)(Game::current->player1->position[2] + sunPosition[2])};
     assign(sunLight, activeView.light_diffuse);
     assign(sunLight, activeView.light_specular);
     assign(lightPosition, activeView.light_position);
diff --git a/src/map.cc b/src/map.cc
index 3986691..6ab022b 100644
--- a/src/map.cc
+++ b/src/map.cc
@@ -27,6 +27,7 @@
 #include <SDL2/SDL_endian.h>
 #include <SDL2/SDL_image.h>
 #include <zlib.h>
+#include <cstdlib>
 
 /* VISRADIUS is half-width of square of drawable cells */
 #define VISRADIUS 50
@@ -57,7 +58,7 @@ Cell::Cell() {
 }
 
 /* Returns the normal for a point on the edge of the cell */
-void Cell::getNormal(Coord3d normal, int vertex) const {
+void Cell::getNormal(Coord3d* normal, int vertex) const {
   Coord3d v1;
   Coord3d v2;
 
@@ -96,20 +97,20 @@ void Cell::getNormal(Coord3d normal, int vertex) const {
     break;
   case CENTER:
     getNormal(normal, SOUTH + WEST);
-    getNormal(v1, SOUTH + EAST);
-    add(v1, normal, normal);
-    getNormal(v1, NORTH + WEST);
-    add(v1, normal, normal);
-    getNormal(v1, NORTH + EAST);
-    add(v1, normal, normal);
-    normalize(normal);
+    getNormal(&v1, SOUTH + EAST);
+    *normal = *normal + v1;
+    getNormal(&v1, NORTH + WEST);
+    *normal = *normal + v1;
+    getNormal(&v1, NORTH + EAST);
+    *normal = *normal + v1;
+    *normal = *normal / length(*normal);
     return;
   }
-  crossProduct(v1, v2, normal);
-  normalize(normal);
+  *normal = crossProduct(v1, v2);
+  *normal = *normal / length(*normal);
 }
 /* Works on water heights */
-void Cell::getWaterNormal(Coord3d normal, int vertex) const {
+void Cell::getWaterNormal(Coord3d* normal, int vertex) const {
   Coord3d v1;
   Coord3d v2;
 
@@ -148,21 +149,24 @@ void Cell::getWaterNormal(Coord3d normal, int vertex) const {
     break;
   case CENTER:
     getWaterNormal(normal, SOUTH + WEST);
-    getWaterNormal(v1, SOUTH + EAST);
-    add(v1, normal, normal);
-    getWaterNormal(v1, NORTH + WEST);
-    add(v1, normal, normal);
-    getWaterNormal(v1, NORTH + EAST);
-    add(v1, normal, normal);
-    normalize(normal);
+    getWaterNormal(&v1, SOUTH + EAST);
+    *normal = *normal + v1;
+    getWaterNormal(&v1, NORTH + WEST);
+    *normal = *normal + v1;
+    getWaterNormal(&v1, NORTH + EAST);
+    *normal = *normal + v1;
+    *normal = *normal / length(*normal);
     return;
   }
-  crossProduct(v1, v2, normal);
-  normalize(normal);
+  *normal = crossProduct(v1, v2);
+  *normal = *normal / length(*normal);
 }
 
 /* Gives the height of the cell in a specified (floatingpoint) position */
 Real Cell::getHeight(Real x, Real y) const {
+  if (x < 0. || x > 1. || y < 0. || y > 1.) {
+    warning("Require x,y in [0,1], got %f %f", x, y);
+  }
   Real h1, h2, h3, c;
 
   c = heights[CENTER];
@@ -249,8 +253,8 @@ Map::Map(char* filename) {
 
   isBonus = 0;
 
-  snprintf(mapname, sizeof(mapname), _("Unknown track"));
-  snprintf(author, sizeof(author), _("Unknown author"));
+  memset(mapname, 0, sizeof(mapname));
+  memset(author, 0, sizeof(author));
   gp = gzopen(filename, "rb");
   if (gp) {
     int version;
@@ -659,12 +663,12 @@ void Map::fillChunkVBO(Chunk* chunk) const {
       if (c.flags & CELL_SHADE_FLAT) {
         for (size_t i = 0; i < 15; i++) { fcnormal[i / 3][i % 3] = 0.f; }
       } else {
-        double cnormal[5][3];
-        c.getNormal(&cnormal[0][0], 0);
-        c.getNormal(&cnormal[1][0], 1);
-        c.getNormal(&cnormal[2][0], 2);
-        c.getNormal(&cnormal[3][0], 3);
-        c.getNormal(&cnormal[4][0], 4);
+        Coord3d cnormal[5];
+        c.getNormal(&cnormal[0], 0);
+        c.getNormal(&cnormal[1], 1);
+        c.getNormal(&cnormal[2], 2);
+        c.getNormal(&cnormal[3], 3);
+        c.getNormal(&cnormal[4], 4);
         for (size_t i = 0; i < 15; i++) {
           fcnormal[i / 3][i % 3] = (float)cnormal[i / 3][i % 3];
         }
@@ -737,9 +741,34 @@ void Map::fillChunkVBO(Chunk* chunk) const {
                ne.wallColors[Cell::EAST + Cell::NORTH], 0.5f, 0.5f, 0, nv[0], nv[1],
                ewover ? enormal : wnormal);
 
-      // Render the quad. The heights autocorrect orientations
-      const ushort quadmap[12] = {0, 1, 2, 1, 3, 2, 4, 6, 5, 6, 7, 5};
-      for (uint i = 0; i < 12; i++) { widx[j * 12 + i] = j * 8 + quadmap[i]; }
+      // Render the quads, overlapping triangles if twisted
+      const ushort quadmap[6] = {0, 1, 2, 1, 3, 2};
+      const ushort utriang[6] = {0, 1, 3, 0, 3, 2};
+      const ushort dtriang[6] = {0, 1, 2, 1, 2, 3};
+      const ushort* sel;
+      if (cmp(c.heights[Cell::SOUTH + Cell::WEST], ns.heights[Cell::NORTH + Cell::WEST]) *
+              cmp(c.heights[Cell::SOUTH + Cell::EAST], ns.heights[Cell::NORTH + Cell::EAST]) >=
+          0) {
+        sel = quadmap;
+      } else if (c.heights[Cell::SOUTH + Cell::WEST] < ns.heights[Cell::NORTH + Cell::WEST]) {
+        sel = utriang;
+      } else {
+        sel = dtriang;
+      }
+      for (uint i = 0; i < 6; i++) widx[j * 12 + i] = j * 8 + sel[i];
+
+      const ushort aquadmap[6] = {0, 2, 1, 2, 3, 1};
+      const ushort autriang[6] = {0, 2, 1, 2, 3, 1};
+      const ushort adtriang[6] = {0, 3, 1, 2, 3, 0};
+      if (cmp(c.heights[Cell::WEST + Cell::SOUTH], ne.heights[Cell::EAST + Cell::SOUTH]) +
+          cmp(c.heights[Cell::WEST + Cell::NORTH], ne.heights[Cell::EAST + Cell::NORTH])) {
+        sel = aquadmap;
+      } else if (c.heights[Cell::WEST + Cell::SOUTH] > ne.heights[Cell::EAST + Cell::SOUTH]) {
+        sel = autriang;
+      } else {
+        sel = adtriang;
+      }
+      for (uint i = 0; i < 6; i++) widx[j * 12 + 6 + i] = j * 8 + 4 + sel[i];
 
       // Line data ! (thankfully they're all black)
       int s = j * 12;
@@ -770,12 +799,12 @@ void Map::fillChunkVBO(Chunk* chunk) const {
       // Water
       int wvis = c.isWaterVisible();
       if (wvis) {
-        double onormal[5][3];
-        c.getWaterNormal(&onormal[0][0], 0);
-        c.getWaterNormal(&onormal[1][0], 1);
-        c.getWaterNormal(&onormal[2][0], 2);
-        c.getWaterNormal(&onormal[3][0], 3);
-        c.getWaterNormal(&onormal[4][0], 4);
+        Coord3d onormal[5];
+        c.getWaterNormal(&onormal[0], 0);
+        c.getWaterNormal(&onormal[1], 1);
+        c.getWaterNormal(&onormal[2], 2);
+        c.getWaterNormal(&onormal[3], 3);
+        c.getWaterNormal(&onormal[4], 4);
         float fonormal[5][3];
         for (size_t i = 0; i < 15; i++) {
           fonormal[i / 3][i % 3] = (float)onormal[i / 3][i % 3];
@@ -910,20 +939,25 @@ void Map::fillChunkVBO(Chunk* chunk) const {
 void Map::markCellsUpdated(int x1, int y1, int x2, int y2, int changed_walls) {
   /* If the walls of a cell have changed, update its neighbors */
   int dd = changed_walls ? 1 : 0;
-  for (int x = std::min(x1, x2) - dd; x <= std::max(x1, x2) + dd; x++) {
-    for (int y = std::min(y1, y2) - dd; y <= std::max(y1, y2) + dd; y++) {
-      Cell& c = cell(x, y);
-      if (0 <= x && x < width && 0 <= y && y <= width) {
-        Chunk& z = *chunk(x - x % CHUNKSIZE, y - y % CHUNKSIZE);
-        z.is_updated = 1;
-        c.displayListDirty = 1;
 
-        // Extend bounding box
-        for (int k = 0; k < 5; k++) {
-          z.minHeight = std::min(z.minHeight, c.heights[k]);
-          z.minHeight = std::min(z.minHeight, c.waterHeights[k]);
-          z.maxHeight = std::max(z.maxHeight, c.heights[k]);
-          z.maxHeight = std::max(z.maxHeight, c.waterHeights[k]);
+  /* Apply the same clamping to bounds as for cell lookups */
+  int xmin = std::max(std::min(std::min(x1, x2) - dd, width - 1), 0);
+  int xmax = std::max(std::min(std::max(x1, x2) + dd, width - 1), 0);
+  int ymin = std::max(std::min(std::min(y1, y2) - dd, height - 1), 0);
+  int ymax = std::max(std::min(std::max(y1, y2) + dd, height - 1), 0);
+
+  for (int xp = xmin - xmin % CHUNKSIZE; xp <= xmax - xmax % CHUNKSIZE; xp += CHUNKSIZE) {
+    for (int yp = ymin - ymin % CHUNKSIZE; yp <= ymax - ymax % CHUNKSIZE; yp += CHUNKSIZE) {
+      Chunk* z = chunk(xp, yp);
+      z->is_updated = 1;
+      for (int x = std::max(xmin, xp); x <= std::min(xmax, xp + CHUNKSIZE - 1); x++) {
+        for (int y = std::max(ymin, yp); y <= std::min(ymax, yp + CHUNKSIZE - 1); y++) {
+          Cell& c = cells[x + width * y];
+          c.displayListDirty = 1;
+          for (int k = 0; k < 5; k++) {
+            z->minHeight = std::min(z->minHeight, std::min(c.heights[k], c.waterHeights[k]));
+            z->maxHeight = std::max(z->maxHeight, std::max(c.heights[k], c.waterHeights[k]));
+          }
         }
       }
     }
@@ -1020,43 +1054,43 @@ void Map::drawLoop(int x1, int y1, int x2, int y2, int kind) {
       yh = std::max(y1, y2);
   for (int x = xl; x <= xh; x++) {
     Cell& c = cell(x, yl);
-    Coord3d lx = {(double)x, (double)yl, c.heights[Cell::SOUTH + Cell::WEST]};
-    Coord3d ly = {(double)x + 1, (double)yl, c.heights[Cell::SOUTH + Cell::EAST]};
-    assign(lx, rp[k]);
+    Coord3d lx((double)x, (double)yl, c.heights[Cell::SOUTH + Cell::WEST]);
+    Coord3d ly((double)x + 1, (double)yl, c.heights[Cell::SOUTH + Cell::EAST]);
+    rp[k] = lx;
     k++;
-    assign(ly, rp[k]);
+    rp[k] = ly;
     k++;
   }
   for (int y = yl; y <= yh; y++) {
     Cell& c = cell(xh, y);
-    Coord3d lx = {(double)xh + 1, (double)y, c.heights[Cell::SOUTH + Cell::EAST]};
-    Coord3d ly = {(double)xh + 1, (double)y + 1, c.heights[Cell::NORTH + Cell::EAST]};
-    assign(lx, rp[k]);
+    Coord3d lx((double)xh + 1, (double)y, c.heights[Cell::SOUTH + Cell::EAST]);
+    Coord3d ly((double)xh + 1, (double)y + 1, c.heights[Cell::NORTH + Cell::EAST]);
+    rp[k] = lx;
     k++;
-    assign(ly, rp[k]);
+    rp[k] = ly;
     k++;
   }
   for (int x = xh; x >= xl; x--) {
     Cell& c = cell(x, yh);
-    Coord3d lx = {(double)x + 1, (double)yh + 1, c.heights[Cell::NORTH + Cell::EAST]};
-    Coord3d ly = {(double)x, (double)yh + 1, c.heights[Cell::NORTH + Cell::WEST]};
-    assign(lx, rp[k]);
+    Coord3d lx((double)x + 1, (double)yh + 1, c.heights[Cell::NORTH + Cell::EAST]);
+    Coord3d ly((double)x, (double)yh + 1, c.heights[Cell::NORTH + Cell::WEST]);
+    rp[k] = lx;
     k++;
-    assign(ly, rp[k]);
+    rp[k] = ly;
     k++;
   }
   for (int y = yh; y >= yl; y--) {
     Cell& c = cell(xl, y);
-    Coord3d lx = {(double)xl, (double)y + 1, c.heights[Cell::NORTH + Cell::WEST]};
-    Coord3d ly = {(double)xl, (double)y, c.heights[Cell::NORTH + Cell::EAST]};
-    assign(lx, rp[k]);
+    Coord3d lx((double)xl, (double)y + 1, c.heights[Cell::NORTH + Cell::WEST]);
+    Coord3d ly((double)xl, (double)y, c.heights[Cell::NORTH + Cell::EAST]);
+    rp[k] = lx;
     k++;
-    assign(ly, rp[k]);
+    rp[k] = ly;
     k++;
   }
   /* Close the loop */
-  assign(ringPoints[k - 1], ringPoints[0]);
-  assign(ringPoints[1], ringPoints[k]);
+  ringPoints[0] = ringPoints[k - 1];
+  ringPoints[k] = ringPoints[1];
 
   GLfloat* data = new GLfloat[8 * 2 * npts];
   GLfloat width = 0.05f;
@@ -1064,30 +1098,23 @@ void Map::drawLoop(int x1, int y1, int x2, int y2, int kind) {
   char* pos = (char*)data;
   int nontrivial = 0;
   for (int i = 1; i < npts + 1; i++) {
-    Coord3d prev, cur, nxt;
-    assign(ringPoints[i - 1], prev);
-    assign(ringPoints[i], cur);
-    assign(ringPoints[i + 1], nxt);
-    Coord3d dir1, dir2, dir;
-    sub(nxt, cur, dir1);
-    sub(cur, prev, dir2);
+    Coord3d prev = ringPoints[i - 1], cur = ringPoints[i], nxt = ringPoints[i + 1];
+    Coord3d dir1 = nxt - cur, dir2 = cur - prev;
     if (length(dir1) < 1e-2 && length(dir1) < 1e-2) { continue; }
-    if (length(dir1) < 1e-2) { assign(dir2, dir1); }
-    if (length(dir2) < 1e-2) { assign(dir1, dir2); }
-    normalize(dir1);
-    normalize(dir2);
-    add(dir1, dir2, dir);
+    if (length(dir1) < 1e-2) { dir1 = dir2; }
+    if (length(dir2) < 1e-2) { dir2 = dir1; }
+    dir1 = dir1 / length(dir1);
+    dir2 = dir2 / length(dir2);
+    Coord3d dir = dir1 + dir2;
     if (length(dir) < 1e-2) { continue; }
     nontrivial++;
-    normalize(dir);
+    dir = dir / length(dir);
     dir[2] = 0;
-    Coord3d up = {0., 0., 1.};
-    Coord3d res;
-    crossProduct(up, dir, res);
+    Coord3d up(0., 0., 1.);
+    Coord3d res = crossProduct(up, dir);
     res[2] = 0.;
-    if (length(res) > 0) normalize(res);
-    Coord3d anti;
-    crossProduct(dir, res, anti);
+    if (length(res) > 0) res = res / length(res);
+    Coord3d anti = crossProduct(dir, res);
     GLfloat off = 1e-2;
     kind = nontrivial % 2;
     pos += packObjectVertex(pos, cur[0] + width * res[0] + off * anti[0],
@@ -1243,12 +1270,12 @@ int Map::save(char* pathname, int x, int y) {
 
   gzFile gp = gzopen(pathname, "wb9");
   if (!gp) return 0;
-  startPosition[0] = x;
-  startPosition[1] = y;
-  startPosition[2] = cell(x, y).heights[Cell::CENTER];
+  Coord3d tmp = startPosition;
+  startPosition = Coord3d(x, y, cell(x, y).heights[Cell::CENTER]);
   int32_t data[6];
   for (int i = 0; i < 3; i++)
     data[i] = saveInt((int32_t)startPosition[i]);  // no decimal part needed
+  tmp = startPosition;
   data[3] = saveInt((int32_t)width);
   data[4] = saveInt((int32_t)height);
   data[5] = saveInt((int32_t)version);
diff --git a/src/map.h b/src/map.h
index ba159b0..8622f8a 100644
--- a/src/map.h
+++ b/src/map.h
@@ -60,8 +60,8 @@ class Cell {
   void load(class Map *map, gzFile gp, int version);
 
   Cell();
-  void getNormal(Coord3d, int vertex) const;
-  void getWaterNormal(Coord3d, int vertex) const;
+  void getNormal(Coord3d *, int vertex) const;
+  void getWaterNormal(Coord3d *, int vertex) const;
   Real getHeight(Real x, Real y) const;
   Real getWaterHeight(Real x, Real y) const;
   inline int isWaterVisible() const {
@@ -104,13 +104,14 @@ class Map {
   void drawLoop(int x1, int y1, int x2, int y2, int kind);
   void drawSpotRing(Real x1, Real y1, Real r, int kind);
   inline Real getHeight(Real x, Real y) const {
-    int ix = (int)x;
-    int iy = (int)y;
+    // the obvious alternative (int)-cast gets misoptimized under -O3
+    int ix = std::floor(x);
+    int iy = std::floor(y);
     return cell(ix, iy).getHeight(x - ix, y - iy);
   }
   inline Real getWaterHeight(Real x, Real y) const {
-    int ix = (int)x;
-    int iy = (int)y;
+    int ix = std::floor(x);
+    int iy = std::floor(y);
     return cell(ix, iy).getWaterHeight(x - ix, y - iy);
   }
 
diff --git a/src/menusystem.cc b/src/menusystem.cc
index 2b3bd55..bb93138 100644
--- a/src/menusystem.cc
+++ b/src/menusystem.cc
@@ -148,7 +148,6 @@ void menuItem_Left(int code, int row, const char *leftStr) {
 void menuItem_Center(int code, int row, const char *str) {
   int fontSize = computeMenuSize();
   int menuSpacing = 17 * fontSize / 10;
-  int screenBorder = computeScreenBorder();
   int top = 100 + 3 * fontSize;
   addText_Center(code, fontSize, (row + 1) * menuSpacing + top, str, screenWidth / 2);
 }
diff --git a/src/mmad.cc b/src/mmad.cc
index 19c15a6..510e6dd 100644
--- a/src/mmad.cc
+++ b/src/mmad.cc
@@ -57,7 +57,6 @@
 #include <shlobj.h>
 #include <windows.h>
 #endif
-using namespace std;
 
 /* Important globals */
 SDL_Window *window = NULL;
@@ -145,7 +144,7 @@ void changeScreenResolution() {
     mainContext = SDL_GL_CreateContext(window);
 
     char str[256];
-    snprintf(str, sizeof(str), "%s/icons/trackballs-32x32.png", effectiveShareDir);
+    snprintf(str, sizeof(str), "%s/icons/trackballs-128x128.png", effectiveShareDir);
     SDL_Surface *wmIcon = IMG_Load(str);
     if (wmIcon) {
       SDL_SetWindowIcon(window, wmIcon);
@@ -311,14 +310,6 @@ void innerMain(void * /*closure*/, int argc, char **argv) {
     next_option = getopt_long(argc, argv, short_options, long_options, NULL);
 #endif
 
-    /*
-#ifdef solaris
-    next_option = getopt(argc,argv,short_options);
-#else
-    next_option = getopt_long (argc, argv, short_options,
-    long_options, NULL);
-#endif
-    */
     int i;
     switch (next_option) {
     case 'h':
@@ -393,19 +384,17 @@ void innerMain(void * /*closure*/, int argc, char **argv) {
   }
   atexit(SDL_Quit);
 
-  // MB: Until here we are using 7 megs of memory
   changeScreenResolution();
   if (!screen) {
     error("Could not initialize screen resolution (message: '%s')", SDL_GetError());
   }
-  // MB: Until here we are using 42 megs of memory
 
   if (SDL_GetModState() & KMOD_CAPS) {
     warning("capslock is on, the mouse will be visible and not grabbed");
   }
 
   /* initialize OpenGL setup before we draw anything */
-  glHelpInit();  // MB: 1.5 megs
+  glHelpInit();
 
   // set the name of the window
   struct timespec bootStart = getMonotonicTime();
@@ -425,20 +414,13 @@ void innerMain(void * /*closure*/, int argc, char **argv) {
     SDL_GL_SwapWindow(window);
   }
 
-  // MB: Until here we are using 47 megs of memory.
-  // splashscreen is using 5 megs but it is ok since we are freeing it before the real game
-
   /* Initialize all modules */
-  initGuileInterface();  // MB: 0 megs
-  generalInit();         // MB: 0 megs
-
-  // MB: Until here we are using 49 megs of memory.
+  initGuileInterface();
+  generalInit();
 
   if (audio != 0) soundInit();
   Settings::settings->loadLevelSets();
 
-  // MB: Until here we are using 51 megs of memory.
-
   /* Initialize and activate the correct gameModes */
   if (touchMode) {
     char mapname[512];
@@ -457,30 +439,34 @@ void innerMain(void * /*closure*/, int argc, char **argv) {
     Font::init();
     GameMode::activate(EditMode::editMode);
   } else {
-    // MB: Reminder 51 megs it was
-    Font::init();      // MB: Until here we are using 54 megs of memory.
-    MenuMode::init();  // MB: Until here we are using 55 megs of memory.
+    Font::init();
+    MenuMode::init();
 
+    /* Initialize modes */
     MainMode::init();
-    HighScore::init();  // MB: 55
+    HighScore::init();
     EditMode::init();
-
-    EnterHighScoreMode::init();              // MB: 58
-    HallOfFameMode::init();                  // MB: 62
-    SettingsMode::init();                    // MB: 64
-    GameMode::activate(MenuMode::menuMode);  // MB: 65
-    GameHook::init();
+    EnterHighScoreMode::init();
+    HallOfFameMode::init();
+    SettingsMode::init();
+    SetupMode::init();
     CalibrateJoystickMode::init();
+    HelpMode::init();
 
-    SetupMode::init();  // MB: 71
+    /* Initialize game structures */
+    GameHook::init();
     Ball::init();
-    ForceField::init();  // MB: 71
-    HelpMode::init();    // MB: 74
+    ForceField::init();
     Pipe::init();
     PipeConnector::init();
-    volumeChanged();
 
-    // Until here 74 megs
+    /* Activate initial mode */
+    if (Settings::settings->doSpecialLevel) {
+      GameMode::activate(SetupMode::setupMode);
+    } else {
+      GameMode::activate(MenuMode::menuMode);
+    }
+    volumeChanged();
   }
 
   /* Make sure splashscreen has been shown for atleast 1.5 seconds */
diff --git a/src/modPill.cc b/src/modPill.cc
index 0f05631..dd8123b 100644
--- a/src/modPill.cc
+++ b/src/modPill.cc
@@ -42,8 +42,12 @@ ModPill::ModPill(Real x, Real y, int kind, int time, int resurrecting)
   primaryColor[2] = 0.2;
 
   /* set bogus velocity for the rendering of speed mods */
-  velocity[0] = 0.0;
-  velocity[1] = -1.2;
+  if (kind == MOD_SPEED) {
+    velocity[0] = 0.0;
+    velocity[1] = -1.2;
+  } else {
+    velocity = Coord3d();
+  }
 
   modTimeLeft[kind] = -1.0;
   clock = 0.0;
@@ -70,9 +74,6 @@ ModPill::ModPill(Real x, Real y, int kind, int time, int resurrecting)
 ModPill::~ModPill() { this->Animated::~Animated(); }
 
 void ModPill::tick(Real t) {
-  Coord3d v;
-  double dist;
-
   Player *player = Game::current->player1;
   if (!alive) {
     timeLeft -= t;
@@ -88,33 +89,14 @@ void ModPill::tick(Real t) {
     radius = realRadius;
   }
 
-  if (alive && kind == MOD_NITRO) {
-    nitroDebrisCount += t;
-    while (nitroDebrisCount > 0.0) {
-      nitroDebrisCount -= 0.25;
-      Debris *d = new Debris(this, position, velocity, 2.0 + 2.0 * frandom());
-      d->position[0] += (frandom() - 0.5) * radius;
-      d->position[1] += (frandom() - 0.5) * radius;
-      d->position[2] += radius * 1.0;
-      d->velocity[0] = 0.0;
-      d->velocity[1] = 0.0;
-      d->velocity[2] = 0.2;
-      d->gravity = -0.1;
-      d->modTimeLeft[MOD_GLASS] = -1.0;
-      d->primaryColor[0] = 0.1;
-      d->primaryColor[1] = 0.6;
-      d->primaryColor[2] = 0.1;
-      d->no_physics = 1;
-    }
-  }
+  if (alive && kind == MOD_NITRO) Ball::generateNitroDebris(t);
 
   if (alive) {
     position[2] = Game::current->map->getHeight(position[0], position[1]) + radius;
-    sub(player->position, position, v);
-    dist = length(v);
+    Coord3d v = player->position - position;
+    double dist = length(v);
     if (dist < radius + player->radius) {
-      Coord3d signPos;
-      assign(position, signPos);
+      Coord3d signPos = position;
       signPos[2] += 1.0;
 
       /* Explanations of modpills shown after taking them. Note that only bad
diff --git a/src/myWindow.cc b/src/myWindow.cc
index d7c748c..70c0023 100644
--- a/src/myWindow.cc
+++ b/src/myWindow.cc
@@ -20,6 +20,7 @@
 
 #include "myWindow.h"
 
+#include <SDL2/SDL_keyboard.h>
 #include <SDL2/SDL_mouse.h>
 
 MyWindow *MyWindow::allWindows = NULL;
@@ -67,7 +68,7 @@ void MyWindow::mouse(int state, int x, int y) {
     }
   }
 }
-void MyWindow::key(int /*key*/, int /*x*/, int /*y*/) {}
+void MyWindow::key(int /*key*/, int /*shift*/, int /*x*/, int /*y*/) {}
 
 void MyWindow::tick() {}
 void MyWindow::draw() {
@@ -178,12 +179,13 @@ void MyWindow::mouseDownAll(int state, int x, int y) {
 void MyWindow::keyAll(int key) {
   int x, y;
   SDL_GetMouseState(&x, &y);
+  int shift = SDL_GetModState() & KMOD_SHIFT;
 
   MyWindow *pntr = allWindows;
   while (pntr) {
     MyWindow *next = pntr->next;
     if (pntr->isInside(x, y)) {
-      pntr->key(key, x, y);
+      pntr->key(key, shift, x, y);
       break;
     }
     pntr = next;
diff --git a/src/myWindow.h b/src/myWindow.h
index 9c90ba8..6417f22 100644
--- a/src/myWindow.h
+++ b/src/myWindow.h
@@ -34,7 +34,7 @@ class MyWindow {
   virtual void tick();
   virtual void mouse(int state, int x, int y);
   virtual void mouseDown(int button, int x, int y);
-  virtual void key(int key, int x, int y);
+  virtual void key(int key, int shift, int x, int y);
   virtual void attached();
   virtual void removed();
 
diff --git a/src/pipe.cc b/src/pipe.cc
index 6e017d6..d7869ec 100644
--- a/src/pipe.cc
+++ b/src/pipe.cc
@@ -29,9 +29,8 @@ void Pipe::reset() {
 }
 Pipe::Pipe(Coord3d f, Coord3d t, Real r) : Animated() {
   /* Note that the position attribute of Pipes are not used, use rather the to/from values */
-
-  assign(f, from);
-  assign(t, to);
+  from = f;
+  to = t;
   radius = r;
   pipes->insert(this);
   primaryColor[0] = primaryColor[1] = primaryColor[2] = 0.6;
@@ -45,21 +44,16 @@ int Pipe::generateBuffers(GLuint *&idxbufs, GLuint *&databufs) {
   allocateBuffers(1, idxbufs, databufs);
   up[0] = up[1] = 0.0;
   up[2] = 1.0;
-  Coord3d dir;
-  sub(to, from, dir);
-  normalize(dir);
+  Coord3d dir = to - from;
+  dir = dir / length(dir);
   right[0] = dir[1];
   right[1] = -dir[0];
   right[2] = 0.0;
-  normalize(right);
-  crossProduct(dir, right, up);
-  if (up[2] < 0.0) {
-    up[0] *= -1.;
-    up[1] *= -1.;
-    up[2] *= -1.;
-  }
+  right = right / length(right);
+  up = crossProduct(dir, right);
+  if (up[2] < 0.0) up = -up;
 
-  int nfacets = 24;
+  const int nfacets = 24;
 
   // Draw pipe
   GLfloat data[2 * nfacets][8];
diff --git a/src/pipeConnector.cc b/src/pipeConnector.cc
index 17d66d2..560afa8 100644
--- a/src/pipeConnector.cc
+++ b/src/pipeConnector.cc
@@ -27,7 +27,7 @@ void PipeConnector::reset() {
   connectors = new std::set<PipeConnector *>();
 }
 PipeConnector::PipeConnector(Coord3d pos, Real r) : Animated() {
-  assign(pos, position);
+  position = pos;
   radius = r;
   primaryColor[0] = primaryColor[1] = primaryColor[2] = 0.6;
   connectors->insert(this);
diff --git a/src/player.cc b/src/player.cc
index b8148ed..6fbed9c 100644
--- a/src/player.cc
+++ b/src/player.cc
@@ -32,6 +32,57 @@
 #include <SDL2/SDL_keyboard.h>
 #include <SDL2/SDL_mouse.h>
 
+Uint32 getFilteredRelativeMouse(double *xrate, double *yrate) {
+  /* Finite impulse response filter to smooth mouse input */
+  const int N = 1000;
+  const double T = 0.2;
+  static int fir[N][2];
+  static double ts[N];
+  static int first = true;
+  if (first) {
+    for (int i = 0; i < N; i++) {
+      fir[i][0] = 0;
+      fir[i][1] = 0;
+      ts[i] = -1. - T;
+    }
+    first = false;
+  }
+
+  double now = Game::current->gameTime;
+
+  int mouseX, mouseY;
+  Uint32 mouseState = SDL_GetRelativeMouseState(&mouseX, &mouseY);
+  if (mouseX || mouseY) {
+    /* Add value to filter */
+
+    int cx = mouseX, cy = mouseY;
+    double ct = now;
+    int i = 0;
+    for (; ts[i] > now - T; i++) {
+      std::swap(fir[i][0], cx);
+      std::swap(fir[i][1], cy);
+      std::swap(ts[i], ct);
+    }
+    std::swap(fir[i][0], cx);
+    std::swap(fir[i][1], cy);
+    std::swap(ts[i], ct);
+  }
+
+  int sx = 0, sy = 0;
+  for (int i = 0; ts[i] > now - T; i++) {
+    if (ts[i] < now - T / 2) {
+      sx += fir[i][0];
+      sy += fir[i][1];
+    } else {
+      sx += 2 * fir[i][0];
+      sy += 2 * fir[i][1];
+    }
+  }
+  *xrate = sx / T / 2;
+  *yrate = sy / T / 2;
+  return mouseState;
+}
+
 Player::Player() : Ball() {
   inTheAir = 0;
   inPipe = 0;
@@ -73,9 +124,7 @@ void Player::draw() {
   Ball::draw();
 }
 void Player::tick(Real t) {
-  double dx, dy;
-  int superAccelerate = 0;
-  static time_t lastTick = 0;
+  static Real timeFraction = 0.;
 
   /* Never let us drop below 0 points, it just looks silly */
   if (score < 0) score = 0;
@@ -83,18 +132,18 @@ void Player::tick(Real t) {
   if (!Game::current) return;
   if (!playing) return;
 
-  dx = 0.0;
-  dy = 0.0;
   Map *map = Game::current->map;
   health += t * 0.4;
   if (health > 1.0) health = 1.0;
 
-  time_t thisTick = time(NULL);
-  if (thisTick != lastTick && !hasWon) {
-    timeLeft--;
-    if (timeLeft < 15) playEffect(SFX_TIME_WARNING);
+  timeFraction += t;
+  if (timeFraction > 1.0) {
+    timeFraction -= 1.0;
+    if (!hasWon) {
+      timeLeft--;
+      if (timeLeft < 15) playEffect(SFX_TIME_WARNING);
+    }
   }
-  lastTick = thisTick;
   if (timeLeft < 1) {
     /* Only die from running out of time if we are not running
        in sandbox mode. */
@@ -123,10 +172,10 @@ void Player::tick(Real t) {
   } else
     oxygen = std::min(1.0, oxygen + (t / 4.0) / Game::current->oxygenFactor);
 
+  double dx = 0., dy = 0.;
   /* Joysticks */
   if (Settings::settings->hasJoystick()) {
     if (Settings::settings->joystickButton(0)) key(' ');
-    if (Settings::settings->joystickButton(1)) superAccelerate = 1;
 
     double joyX = Settings::settings->joystickX();
     double joyY = Settings::settings->joystickY();
@@ -134,49 +183,50 @@ void Player::tick(Real t) {
     if (joyX < 0.1 && joyX > -0.1) joyX = 0.0;
     if (joyY < 0.1 && joyY > -0.1) joyY = 0.0;
 
-    dx = ((double)joyX) * Settings::settings->mouseSensitivity * t * 200.0;
-    dy = ((double)joyY) * Settings::settings->mouseSensitivity * t * 200.0;
+    dx = ((double)joyX) * Settings::settings->mouseSensitivity;
+    dy = ((double)joyY) * Settings::settings->mouseSensitivity;
   }
 
   /* Give only *relative* mouse movements */
   if (!Settings::settings->ignoreMouse && !(SDL_GetModState() & KMOD_CAPS)) {
-    int mouseX, mouseY;
-
-    Uint32 mouseState = SDL_GetRelativeMouseState(&mouseX, &mouseY);
-
-    if (mouseState & SDL_BUTTON_RMASK) superAccelerate = 1;
-    if ((mouseX || mouseY)) {
-      dx = mouseX * Settings::settings->mouseSensitivity * 0.1;
-      dy = mouseY * Settings::settings->mouseSensitivity * 0.1;
+    double sx, sy;
+    getFilteredRelativeMouse(&sx, &sy);
+    if (sx || sy) {
+      dx = sx * Settings::settings->mouseSensitivity * 0.0005;
+      dy = sy * Settings::settings->mouseSensitivity * 0.0005;
     }
   }
 
   /* Handle keyboard steering */
   const Uint8 *keystate = SDL_GetKeyboardState(NULL);
   int shift = SDL_GetModState() & (KMOD_LSHIFT | KMOD_RSHIFT);
-  double kscale = shift ? 200.0 : 100.0;
 
-  if (keystate[SDL_SCANCODE_UP] || keystate[SDL_SCANCODE_KP_8]) { dy = -kscale * t; }
-  if (keystate[SDL_SCANCODE_DOWN] || keystate[SDL_SCANCODE_KP_2]) { dy = kscale * t; }
-  if (keystate[SDL_SCANCODE_LEFT] || keystate[SDL_SCANCODE_KP_4]) { dx = -kscale * t; }
-  if (keystate[SDL_SCANCODE_RIGHT] || keystate[SDL_SCANCODE_KP_6]) { dx = kscale * t; }
+  int ix = 0, iy = 0;
+  if (keystate[SDL_SCANCODE_UP] || keystate[SDL_SCANCODE_KP_8]) iy--;
+  if (keystate[SDL_SCANCODE_DOWN] || keystate[SDL_SCANCODE_KP_2]) iy++;
+  if (keystate[SDL_SCANCODE_LEFT] || keystate[SDL_SCANCODE_KP_4]) ix--;
+  if (keystate[SDL_SCANCODE_RIGHT] || keystate[SDL_SCANCODE_KP_6]) ix++;
   if (keystate[SDL_SCANCODE_KP_7] || keystate[SDL_SCANCODE_Q]) {
-    dx = -kscale * t;
-    dy = -kscale * t;
+    ix--;
+    iy--;
   }
   if (keystate[SDL_SCANCODE_KP_9] || keystate[SDL_SCANCODE_W]) {
-    dx = kscale * t;
-    dy = -kscale * t;
+    ix++;
+    iy--;
   }
   if (keystate[SDL_SCANCODE_KP_1] || keystate[SDL_SCANCODE_A]) {
-    dx = -kscale * t;
-    dy = kscale * t;
+    ix--;
+    iy++;
   }
   if (keystate[SDL_SCANCODE_KP_3] || keystate[SDL_SCANCODE_S]) {
-    dx = kscale * t;
-    dy = kscale * t;
+    ix++;
+    iy++;
+  }
+  if (ix || iy) {
+    double len = std::sqrt(ix * ix + iy * iy);
+    dx = ix / len;
+    dy = iy / len;
   }
-  if (keystate[SDL_SCANCODE_KP_ENTER] || keystate[SDL_SCANCODE_RETURN]) superAccelerate = 1;
 
   /* rotate control as by settings->rotateArrows */
   {
@@ -194,69 +244,32 @@ void Player::tick(Real t) {
     dx = tmp;
   }
 
-  /* Cap is the maximum normal acceleration we are allowed to perform (on average) per second
-   */
-  double cap = 140.0 - 10.0 * Settings::settings->difficulty;
-  if (modTimeLeft[MOD_SPEED]) {
-    dx *= 1.5;
-    dy *= 1.5;
-    cap = 200.0;
-  }
-  if (modTimeLeft[MOD_DIZZY]) cap = cap / 2.0;
-
-  /* Limit size of actual movement according to "cap" */
-  /* Uses a trick to avoid capping away movements from integer only devices (eg. mouse) while
-   * having a high FPS */
-  moveBurst = std::min(cap * 0.2, moveBurst + cap * t);
-  double len = sqrt(dx * dx + dy * dy);
-  if (len > moveBurst) {
-    dx = dx * moveBurst / len;
-    dy = dy * moveBurst / len;
-    len = moveBurst;
+  /* Cap dx/dy to have total radius 1. */
+  double len = std::sqrt(dx * dx + dy * dy);
+  if (len > 1.) {
+    dx /= len;
+    dy /= len;
   }
-  moveBurst -= len;
-
-  /*
-  if(modTimeLeft[MOD_DIZZY]) {
-        double tmp = dx * sin(Game::current->gameTime*M_PI*0.1) + dy *
-  cos(Game::current->gameTime*M_PI*0.1);
-        dy = dx * cos(Game::current->gameTime*M_PI*0.1) - dy *
-  sin(Game::current->gameTime*M_PI*0.1);
-        dx = tmp;
-        }*/
-
-  /* Do the movement. Also, if nitro is active then create debris after the ball */
-
-  if (!modTimeLeft[MOD_FROZEN] && !hasWon && is_on) {
-    rotation[0] -= 0.025 * (dy - dx);
-    rotation[1] -= 0.025 * (dx + dy);
-
-    if (superAccelerate && modTimeLeft[MOD_NITRO]) {
-      double dirX = rotation[0];
-      double dirY = rotation[1];
-      double len = sqrt(dirX * dirX + dirY * dirY);
-      static double nitroDebris = 0.0;
-      nitroDebris += t;
-      while (nitroDebris > 0.1) {
-        nitroDebris -= 0.1;
-        Debris *d = new Debris(this, position, velocity, 1.0 + frandom() * 2.0);
-        d->position[0] += (frandom() - 0.5) * radius - velocity[0] * 0.1;
-        d->position[1] += (frandom() - 0.5) * radius - velocity[1] * 0.1;
-        d->position[2] += (frandom() - 0.5) * radius;
-        d->modTimeLeft[MOD_GLASS] = -1.0;
-        d->primaryColor[0] = 0.1;
-        d->primaryColor[1] = 0.6;
-        d->primaryColor[2] = 0.1;
-      }
-      if (len > 0.0) {
-        dirX /= len;
-        dirY /= len;
-        rotation[0] += dirX * t * 10.0;
-        rotation[1] += dirY * t * 10.0;
-      }
-    }
+
+  // Rotate by 45 degrees, introduce sqrt2 scale factor
+  double tx = -(dy - dx);
+  double ty = -(dy + dx);
+  dx = tx;
+  dy = ty;
+
+  if (shift) {
+    dx *= 0.5;
+    dy *= 0.5;
   }
 
+  /* set inherent base acceleration*/
+  acceleration = 3.5 - 0.25 * Settings::settings->difficulty;
+
+  if (!hasWon && is_on) {
+    Ball::drive(dx, dy);
+  } else {
+    Ball::drive(0., 0.);
+  }
   if (!hasWon)
     friction = 1.0;
   else
@@ -274,23 +287,12 @@ void Player::key(int c) {
   }
 }
 void Player::jump() {
-  if (!inTheAir) {
-    if (Game::current->map->cell((int)position[0], (int)position[1]).flags & CELL_ACID)
-      velocity[2] +=
-          1.0 * Game::current->jumpFactor * (1.2 - 0.1 * Settings::settings->difficulty);
-    else if (modTimeLeft[MOD_JUMP])
-      velocity[2] +=
-          5.0 * Game::current->jumpFactor * (1.2 - 0.1 * Settings::settings->difficulty);
-    else
-      velocity[2] +=
-          2.0 * Game::current->jumpFactor * (1.2 - 0.1 * Settings::settings->difficulty);
-    double dh = position[2] - Game::current->map->getHeight(position[0], position[1]);
-    if (dh > 0.20)
-      dh = 0.20;  // we are not supposed to be not "inTheAir" and also have dh > 0.20!
-    position[2] += std::min(0.2, 0.20 - dh);
-    inTheAir = true;
-  }
+  double jumpStrength =
+      Game::current->jumpFactor * (1.2 - 0.1 * Settings::settings->difficulty);
+  jumpStrength *= modTimeLeft[MOD_JUMP] ? 5.0 : 3.0;
+  Ball::queueJump(jumpStrength);
 }
+
 void Player::die(int how) {
   Map *map = Game::current->map;
   /* immortal when not playing (i.e., at level finish) */
@@ -318,10 +320,8 @@ void Player::die(int how) {
   Coord3d pos, vel;
   if (how == DIE_ACID) {
     GLfloat acidColor[4] = {0.1, 0.8, 0.1, 0.5};
-    Coord3d vel = {0.0, 0.0, 0.0};
-    Coord3d center;
-    assign(position, center);
-    center[2] = map->getHeight(center[0], center[1]);
+    Coord3d vel;
+    Coord3d center(position[0], position[1], map->getHeight(position[0], position[1]));
     new Splash(center, vel, acidColor, 32.0, radius);
   } else
     for (int i = 0; i < 4; i++)
@@ -354,7 +354,7 @@ void Player::die(int how) {
 void Player::setStartVariables() {
   sink = 0.0;
   rotation[0] = rotation[1] = 0.;
-  zero(velocity);
+  velocity = Coord3d();
   playing = true;
   alive = 1;
   hasWon = 0;
@@ -367,7 +367,7 @@ void Player::setStartVariables() {
 
 void Player::restart(Coord3d pos) {
   setStartVariables();
-  assign(pos, position);
+  position = pos;
   position[2] = Game::current->map->getHeight(position[0], position[1]) + radius;
   modTimeLeft[MOD_DIZZY] = 0.0;
 
@@ -381,7 +381,7 @@ void Player::setHealth(Real d) {
   if (d < health) health = d;
   if (health < 0.0) health = 0.0;
 }
-Boolean Player::crash(Real speed) {
+bool Player::crash(Real speed) {
   double espeed =
       modTimeLeft[MOD_GLASS] ? (1.5 * speed) / crashTolerance : speed / crashTolerance;
   setHealth(1.0 - espeed);
diff --git a/src/player.h b/src/player.h
index 8983c98..ae0a0b1 100644
--- a/src/player.h
+++ b/src/player.h
@@ -37,13 +37,13 @@ class Player : public Ball {
   void restart(Coord3d);    /**< Restart the ball at given position */
   void mouse(int state, int x, int y);
   void setHealth(Real);
-  virtual Boolean crash(Real speed);
+  virtual bool crash(Real speed);
 
   double health;
   double oxygen;
   double moveBurst;
   int lives, timeLeft, score, hasWon;
-  Boolean playing;
+  bool playing;
 
  private:
   void jump();
diff --git a/src/settings.cc b/src/settings.cc
index c919c9a..12903b9 100644
--- a/src/settings.cc
+++ b/src/settings.cc
@@ -30,6 +30,9 @@
 #include <locale.h>
 #include <string.h>
 #include <sys/stat.h>
+#include <cstdlib>
+
+extern double timeDilationFactor;
 
 /* These are the names/codes codes of languages available from the settings
    menu. The name of languages should appear in the respective native
@@ -77,6 +80,8 @@ Settings::Settings() {
   nLevelSets = 0;
   joy_center[0] = 0;
   joy_center[1] = 0;
+  shadowTexsize = 9;
+  timeCompression = 0;
   memset(specialLevel, 0, sizeof(specialLevel));
   memset(levelSets, 0, sizeof(levelSets));
 
@@ -100,18 +105,21 @@ Settings::Settings() {
         warning("Configuration file should be a series of (key value) tuples.");
         continue;
       }
-      const int intnum = 18, realnum = 3;
+      const int intnum = 21, realnum = 3;
       const char *intkeys[intnum] = {
-          "gfx-details",    "show-fps",     "is-windowed",     "resolution", "color-depth",
-          "joystick-index", "joy_center-x", "joy_center-y",    "joy-left",   "joy-right",
-          "joy-up",         "joy-down",     "rotate-steering", "language",   "ignore-mouse",
-          "do-reflections", "do-shadows",   "vsync-on"};
-
-      int *intdests[intnum] = {&gfx_details,    &showFPS,       &is_windowed,   &resolution,
-                               &colorDepth,     &joystickIndex, &joy_center[0], &joy_center[1],
-                               &joy_left,       &joy_right,     &joy_up,        &joy_down,
-                               &rotateSteering, &language,      &ignoreMouse,   &doReflections,
-                               &doShadows,      &vsynced};
+          "gfx-details",      "show-fps",       "is-windowed",    "resolution",
+          "color-depth",      "joystick-index", "joy_center-x",   "joy_center-y",
+          "joy-left",         "joy-right",      "joy-up",         "joy-down",
+          "rotate-steering",  "language",       "ignore-mouse",   "do-reflections",
+          "do-shadows",       "vsync-on",       "shadow-texsize", "time-compression",
+          "sandbox-available"};
+
+      int *intdests[intnum] = {
+          &gfx_details,     &showFPS,       &is_windowed,    &resolution,    &colorDepth,
+          &joystickIndex,   &joy_center[0], &joy_center[1],  &joy_left,      &joy_right,
+          &joy_up,          &joy_down,      &rotateSteering, &language,      &ignoreMouse,
+          &doReflections,   &doShadows,     &vsynced,        &shadowTexsize, &timeCompression,
+          &sandboxAvailable};
       const char *realkeys[realnum] = {"sfx-volume", "music-volume", "mouse-sensitivity"};
       double *realdests[realnum] = {&sfxVolume, &musicVolume, &mouseSensitivity};
 
@@ -144,6 +152,8 @@ Settings::Settings() {
     }
     scm_close(ip);
   }
+  /* apply time compression immediately */
+  timeDilationFactor = std::pow(2.0, timeCompression / 6.0);
 }
 void Settings::loadLevelSets() {
   /* Load all levelsets */
@@ -225,13 +235,11 @@ void Settings::loadLevelSet(const char *setname, const char *shortname) {
       warning(reqmnt, setname);
       continue;
     }
-    char *sval = NULL;
     char *eval = NULL;
     if (scm_is_string(val)) {
       eval = scm_to_utf8_string(val);
-      sval = eval;
-      int len = strlen(sval);
-      if (len > 0 && sval[len - 1] == '\n') { sval[len - 1] = 0; }
+      int len = strlen(eval);
+      if (len > 0 && eval[len - 1] == '\n') { eval[len - 1] = 0; }
     } else {
       if (scm_to_int(scm_length(val)) != 2 || SCM_CAR(val) != scm_from_utf8_symbol("_") ||
           !scm_is_string(SCM_CADR(val))) {
@@ -239,33 +247,32 @@ void Settings::loadLevelSet(const char *setname, const char *shortname) {
         continue;
       }
       eval = scm_to_utf8_string(SCM_CADR(val));
-      sval = gettext(eval);
     }
 
     char *skey = scm_to_utf8_string(scm_symbol_to_string(key));
     if (!strcmp(skey, "name")) {
-      strncpy(levelSets[nLevelSets].name, sval, 256);
+      strncpy(levelSets[nLevelSets].name, eval, 256);
       levelSets[nLevelSets].name[255] = '\0';
     } else if (!strcmp(skey, "first-level-file")) {
-      strncpy(levelSets[nLevelSets].startLevel, sval, 256);
+      strncpy(levelSets[nLevelSets].startLevel, eval, 256);
       levelSets[nLevelSets].startLevel[255] = '\0';
     } else if (!strcmp(skey, "first-level-name")) {
-      strncpy(levelSets[nLevelSets].startLevelName, sval, 256);
+      strncpy(levelSets[nLevelSets].startLevelName, eval, 256);
       levelSets[nLevelSets].startLevelName[255] = '\0';
     } else if (!strcmp(skey, "desc1")) {
-      strncpy(&levelSets[nLevelSets].description[0][0], sval, 120);
+      strncpy(&levelSets[nLevelSets].description[0][0], eval, 120);
       levelSets[nLevelSets].description[0][119] = '\0';
     } else if (!strcmp(skey, "desc2")) {
-      strncpy(&levelSets[nLevelSets].description[1][0], sval, 120);
+      strncpy(&levelSets[nLevelSets].description[1][0], eval, 120);
       levelSets[nLevelSets].description[1][119] = '\0';
     } else if (!strcmp(skey, "desc3")) {
-      strncpy(&levelSets[nLevelSets].description[2][0], sval, 120);
+      strncpy(&levelSets[nLevelSets].description[2][0], eval, 120);
       levelSets[nLevelSets].description[2][119] = '\0';
     } else if (!strcmp(skey, "desc4")) {
-      strncpy(&levelSets[nLevelSets].description[3][0], sval, 120);
+      strncpy(&levelSets[nLevelSets].description[3][0], eval, 120);
       levelSets[nLevelSets].description[3][119] = '\0';
     } else if (!strcmp(skey, "desc5")) {
-      strncpy(&levelSets[nLevelSets].description[4][0], sval, 120);
+      strncpy(&levelSets[nLevelSets].description[4][0], eval, 120);
       levelSets[nLevelSets].description[4][119] = '\0';
     } else {
       warning("Unidentified key '%s' in level set file %s", skey, setname);
@@ -332,8 +339,11 @@ void Settings::save() {
     fprintf(fp, "(ignore-mouse %d)\n", ignoreMouse);
     fprintf(fp, "(do-reflections %d)\n", doReflections);
     fprintf(fp, "(do-shadows %d)\n", doShadows);
+    fprintf(fp, "(shadow-texsize %d)\n", shadowTexsize);
     fprintf(fp, "(language %d)\n", language);
     fprintf(fp, "(vsync-on %d)\n", vsynced);
+    fprintf(fp, "(time-compression %d)\n", timeCompression);
+    fprintf(fp, "(sandbox-available %d)\n", sandboxAvailable);
     fclose(fp);
   }
 }
diff --git a/src/settings.h b/src/settings.h
index 3ae8d33..bd0bd82 100644
--- a/src/settings.h
+++ b/src/settings.h
@@ -50,6 +50,7 @@ class Settings {
 
   double sfxVolume, musicVolume;
   double mouseSensitivity;
+  int timeCompression;
   int is_windowed, resolution, colorDepth;
   int gfx_details; /* 0 - 5 */
   int showFPS;
@@ -60,6 +61,8 @@ class Settings {
   int doReflections;
   int doShadows;
   int vsynced;
+  int shadowTexsize;
+  int sandboxAvailable;
 
   void setLocale();
   int hasJoystick();
diff --git a/src/settingsMode.cc b/src/settingsMode.cc
index 8430e4e..ea31063 100644
--- a/src/settingsMode.cc
+++ b/src/settingsMode.cc
@@ -35,6 +35,7 @@ SettingsMode *SettingsMode::settingsMode;
 
 /* Not properly abstracted, part of global stuff in mmad.cc */
 extern int screenResolutions[5][2], nScreenResolutions;
+extern double timeDilationFactor;
 extern void changeScreenResolution();
 
 void SettingsMode::init() { settingsMode = new SettingsMode(); }
@@ -127,10 +128,10 @@ void SettingsMode::display() {
 
     // Windowed
     menuItem_LeftRight(MENU_WINDOWED, menucount++, 1, _("Fullscreen"),
-                       (char *)(Settings::settings->is_windowed ? _("No") : _("Yes")));
+                       (Settings::settings->is_windowed ? _("No") : _("Yes")));
 
     menuItem_LeftRight(MENU_VSYNC, menucount++, 1, _("VSync"),
-                       (char *)(Settings::settings->vsynced ? _("Yes") : _("No")));
+                       (Settings::settings->vsynced ? _("Yes") : _("No")));
 
     // show FPS
     switch (Settings::settings->showFPS) {
@@ -174,9 +175,13 @@ void SettingsMode::display() {
     }
     menuItem_LeftRight(MENU_GFX_DETAILS, menucount++, 1, _("Details"), str);
     menuItem_LeftRight(MENU_DO_REFLECTIONS, menucount++, 1, _("Reflections"),
-                       (char *)(Settings::settings->doReflections ? _("Yes") : _("No")));
+                       (Settings::settings->doReflections ? _("Yes") : _("No")));
     menuItem_LeftRight(MENU_DO_SHADOWS, menucount++, 1, _("Shadows"),
-                       (char *)(Settings::settings->doShadows ? _("Yes") : _("No")));
+                       (Settings::settings->doShadows ? _("Yes") : _("No")));
+    if (Settings::settings->doShadows) {
+      snprintf(str, sizeof(str), "%d", 1 << Settings::settings->shadowTexsize);
+      menuItem_LeftRight(MENU_SHADOW_TEXSIZE, menucount++, 1, _("Shadow Resolution"), str);
+    }
 
     break;
 
@@ -186,7 +191,7 @@ void SettingsMode::display() {
 
     /* Use mouse */
     menuItem_LeftRight(MENU_USEMOUSE, menucount++, 1, _("Use mouse"),
-                       (char *)(Settings::settings->ignoreMouse ? _("No") : _("Yes")));
+                       (Settings::settings->ignoreMouse ? _("No") : _("Yes")));
 
     /* Mouse sensitivity */
     if (!Settings::settings->ignoreMouse) {
@@ -222,16 +227,23 @@ void SettingsMode::display() {
 
   case SUBSCREEN_OTHER:
     // Choose subscreen
-    menuItem_Left(MENU_SUBSCREEN, 0, _("Other"));
+    menuItem_Left(MENU_SUBSCREEN, menucount++, _("Other"));
 
+    /* Language */
+    menuItem_LeftRight(MENU_LANGUAGE, menucount++, 1, _("Language"),
+                       Settings::languageNames[Settings::settings->language]);
     /* Music and Sfx volumes */
     snprintf(str, sizeof(str), "%d%%", (int)(Settings::settings->musicVolume * 100.0));
-    menuItem_LeftRight(MENU_MUSIC_VOLUME, 1, 1, _("Music volume"), str);
+    menuItem_LeftRight(MENU_MUSIC_VOLUME, menucount++, 1, _("Music volume"), str);
     snprintf(str, sizeof(str), "%d%%", (int)(Settings::settings->sfxVolume * 100.0));
-    menuItem_LeftRight(MENU_SFX_VOLUME, 2, 1, _("Effects volume"), str);
-    /* Language */
-    menuItem_LeftRight(MENU_LANGUAGE, 3, 1, _("Language"),
-                       Settings::languageNames[Settings::settings->language]);
+    menuItem_LeftRight(MENU_SFX_VOLUME, menucount++, 1, _("Effects volume"), str);
+    menucount++;
+    /* Sandbox mode present */
+    menuItem_LeftRight(MENU_SANDBOX_AVAILABLE, menucount++, 1, _("Sandbox mode available"),
+                       (Settings::settings->sandboxAvailable ? _("Yes") : _("No")));
+    /* Time compression */
+    snprintf(str, sizeof(str), "%.3f", timeDilationFactor);
+    menuItem_LeftRight(MENU_TIME_COMPRESSION, menucount++, 1, _("Time Compression"), str);
 
     break;
   case NUM_SUBSCREENS:
@@ -337,6 +349,11 @@ void SettingsMode::mouseDown(int button, int /*x*/, int /*y*/) {
   case MENU_DO_SHADOWS:
     Settings::settings->doShadows = Settings::settings->doShadows ? 0 : 1;
     break;
+  case MENU_SHADOW_TEXSIZE:
+    Settings::settings->shadowTexsize += (up ? 1 : -1);
+    if (Settings::settings->shadowTexsize > 12) Settings::settings->shadowTexsize = 6;
+    if (Settings::settings->shadowTexsize < 6) Settings::settings->shadowTexsize = 12;
+    break;
   case MENU_SHOW_FPS:
     Settings::settings->showFPS = (Settings::settings->showFPS + 1) % 3;
     break;
@@ -380,7 +397,15 @@ void SettingsMode::mouseDown(int button, int /*x*/, int /*y*/) {
     settings->language =
         mymod(((int)(settings->language + (up ? 1 : -1))), Settings::nLanguages);
     settings->setLocale();
-    /* TODO. Restart all modules to make language change take effect */
+    break;
+  case MENU_SANDBOX_AVAILABLE:
+    Settings::settings->sandboxAvailable = !Settings::settings->sandboxAvailable;
+    break;
+  case MENU_TIME_COMPRESSION:
+    Settings::settings->timeCompression += (up ? 1 : -1);
+    if (Settings::settings->timeCompression > 12) Settings::settings->timeCompression = -12;
+    if (Settings::settings->timeCompression < -12) Settings::settings->timeCompression = 12;
+    timeDilationFactor = std::pow(2.0, Settings::settings->timeCompression / 6.0);
     break;
   }
 }
diff --git a/src/settingsMode.h b/src/settingsMode.h
index cc52c48..ac4971d 100644
--- a/src/settingsMode.h
+++ b/src/settingsMode.h
@@ -58,6 +58,7 @@ class SettingsMode : public GameMode {
     MENU_GFX_DETAILS,
     MENU_DO_REFLECTIONS,
     MENU_DO_SHADOWS,
+    MENU_SHADOW_TEXSIZE,
 
     MENU_USEMOUSE,
     MENU_SENSITIVITY,
@@ -67,6 +68,8 @@ class SettingsMode : public GameMode {
     MENU_MUSIC_VOLUME,
     MENU_SFX_VOLUME,
     MENU_LANGUAGE,
+    MENU_SANDBOX_AVAILABLE,
+    MENU_TIME_COMPRESSION,
 
     MENU_RESOLUTION_OK,
     MENU_RESOLUTION_BAD,
diff --git a/src/setupMode.cc b/src/setupMode.cc
index 6ff958d..d6df3bc 100644
--- a/src/setupMode.cc
+++ b/src/setupMode.cc
@@ -78,7 +78,7 @@ void SetupMode::display() {
   /* Draw background */
   GLfloat coord[4];
   GLuint active;
-  if (screenshot) {
+  if (screenshot && !Settings::settings->doSpecialLevel) {
     active = screenshot;
     for (int i = 0; i < 4; i++) coord[i] = scrshtCoord[i];
   } else {
@@ -87,13 +87,13 @@ void SetupMode::display() {
   }
   /* Avoid distortion. Note 1024x512 textures are possible. */
   if (screenWidth * scrshtH * coord[3] > screenHeight * scrshtW * coord[2]) {
-    double delta =
-        coord[3] - coord[2] * screenHeight * scrshtW / (double)fmax(screenWidth * scrshtH, 1);
+    double delta = coord[3] - coord[2] * screenHeight * scrshtW /
+                                  (double)std::max(screenWidth * scrshtH, 1);
     coord[1] += delta / 2;
     coord[3] -= delta;
   } else {
-    double delta =
-        coord[2] - coord[3] * screenWidth * scrshtH / (double)fmax(screenHeight * scrshtW, 1);
+    double delta = coord[2] - coord[3] * screenWidth * scrshtH /
+                                  (double)std::max(screenHeight * scrshtW, 1);
     coord[0] += delta / 2;
     coord[2] -= delta;
   }
@@ -124,7 +124,7 @@ void SetupMode::display() {
   GLfloat lightDiffuse[3] = {0.9, 0.9, 0.9};
   GLfloat ambient[3] = {0.2, 0.2, 0.2};
   GLfloat black[3] = {0., 0., 0.};
-  Coord3d lightPosition = {-100.0, -50.0, 150.0};
+  GLfloat lightPosition[3] = {-100.0, -50.0, 150.0};
   assign(lightPosition, activeView.light_position);
   assign(lightDiffuse, activeView.light_diffuse);
   assign(lightDiffuse, activeView.light_specular);
@@ -214,15 +214,18 @@ void SetupMode::display() {
     addText_Left(0, fontSize, row0 + rowSep * 1, _("N/A"), col1, col1MaxExtent);
   else
     addText_Left(CODE_LEVEL_SET, fontSize, row0 + rowSep * 1,
-                 settings->levelSets[levelSet].name, col1, col1MaxExtent);
+                 gettext(settings->levelSets[levelSet].name), col1, col1MaxExtent);
 
   /* Start level */
   addText_Left(0, fontSize, row0 + rowSep * 2, _("Level"), col0);
   if (settings->doSpecialLevel)
     addText_Left(0, fontSize, row0 + rowSep * 2, settings->specialLevel, col1, col1MaxExtent);
-  else
+  else if (strlen(gamer->levels[levelSet][level].name))
     addText_Left(CODE_START_LV, fontSize, row0 + rowSep * 2,
-                 gamer->levels[levelSet][level].name, col1, col1MaxExtent);
+                 gettext(gamer->levels[levelSet][level].name), col1, col1MaxExtent);
+  else
+    addText_Left(CODE_START_LV, fontSize, row0 + rowSep * 2, _("Unknown track"), col1,
+                 col1MaxExtent);
 
   /* Difficulty */
   addText_Left(0, fontSize, row0 + rowSep * 3, _("Difficulty"), col0);
@@ -252,11 +255,15 @@ void SetupMode::display() {
                        1.0, 1.0, 1.0);
 
   /* Descriptive level text */
-  int lineno;
-  for (lineno = 0; lineno < 5; lineno++)
-    Font::drawSimpleText(settings->levelSets[levelSet].description[lineno], col0 + lineSize,
-                         row0 + rowSep * 4 + lineSep * lineno, lineSize, 1.0, 1.0, 1.0, 1.0,
-                         screenWidth - col0 - lineSize);
+  if (!Settings::settings->doSpecialLevel) {
+    for (int lineno = 0; lineno < 5; lineno++) {
+      if (strlen(settings->levelSets[levelSet].description[lineno])) {
+        Font::drawSimpleText(gettext(settings->levelSets[levelSet].description[lineno]),
+                             col0 + lineSize, row0 + rowSep * 4 + lineSep * lineno, lineSize,
+                             1.0, 1.0, 1.0, 1.0, screenWidth - col0 - lineSize);
+      }
+    }
+  }
 
   /* Start */
   addText_Center(CODE_START, fontSize, screenHeight - 5 * fontSize / 2, _("Start Game"),
@@ -372,10 +379,15 @@ void SetupMode::mouseDown(int button, int x, int y) {
       }
       break;
     case CODE_DIFFICULTY:
-      settings->difficulty =
-          mymod((settings->difficulty + 3 * settings->sandbox + (left ? 1 : -1)), 6);
-      settings->sandbox = settings->difficulty / 3;
-      settings->difficulty = settings->difficulty % 3;
+      if (settings->sandboxAvailable) {
+        settings->difficulty =
+            mymod((settings->difficulty + 3 * settings->sandbox + (left ? 1 : -1)), 6);
+        settings->sandbox = settings->difficulty / 3;
+        settings->difficulty = settings->difficulty % 3;
+      } else {
+        settings->sandbox = 0;
+        settings->difficulty = mymod((settings->difficulty + (left ? 1 : -1)), 3);
+      }
       break;
     case CODE_START_LV:
       level = mymod((level + (left ? 1 : -1)), gamer->nKnownLevels[levelSet]);
diff --git a/src/setupMode.h b/src/setupMode.h
index 97306f4..b4c10f1 100644
--- a/src/setupMode.h
+++ b/src/setupMode.h
@@ -51,7 +51,7 @@ class SetupMode : public GameMode {
 
   GLuint screenshot;
   GLfloat scrshtCoord[4];
-  GLuint scrshtW, scrshtH;
+  GLint scrshtW, scrshtH;
 };
 
 #endif
diff --git a/src/sideSpike.cc b/src/sideSpike.cc
index 34c47d8..a3ea7bc 100644
--- a/src/sideSpike.cc
+++ b/src/sideSpike.cc
@@ -30,7 +30,7 @@
 #include "spike.h"
 
 SideSpike::SideSpike(Coord3d position, Real speed, Real phase, int side) {
-  assign(position, this->position);
+  this->position = position;
   this->position[2] = Game::current->map->getHeight(position[0], position[1]) + 0.0;
   this->speed = speed;
   while (phase < 0.0) phase += 1.0;
@@ -60,14 +60,14 @@ SideSpike::SideSpike(Coord3d position, Real speed, Real phase, int side) {
 int SideSpike::generateBuffers(GLuint *&idxbufs, GLuint *&databufs) {
   allocateBuffers(1, idxbufs, databufs);
 
-  int nfacets = 6;
+  const int nfacets = 6;
   GLfloat data[(4 * nfacets) * 8];
   ushort idxs[3 * nfacets][3];
 
   Matrix4d frommtx;
   identityMatrix(frommtx);
 
-  Coord3d pos = {position[0], position[1], position[2] + 0.25};
+  Coord3d pos(position[0], position[1], position[2] + 0.25);
   switch (side) {
   case 1:
     rotateY(M_PI / 2, frommtx);
diff --git a/src/sign.cc b/src/sign.cc
index 7c7ae45..c2fa981 100644
--- a/src/sign.cc
+++ b/src/sign.cc
@@ -28,7 +28,7 @@
 #define SIGN_SCALE 0.007
 
 Sign::Sign(const char *string, Real l, Real s, Real r, Coord3d pos) {
-  assign(pos, position);
+  position = pos;
   if (l <= 0.0) l = 1e10;
   life = l;
   scale = s;
diff --git a/src/sparkle2d.cc b/src/sparkle2d.cc
index b09af4c..326cb41 100644
--- a/src/sparkle2d.cc
+++ b/src/sparkle2d.cc
@@ -23,8 +23,6 @@
 
 #include "glHelp.h"
 
-#include <stdlib.h>
-
 /*  structure for */
 
 typedef struct _glitter {
@@ -55,7 +53,7 @@ void Sparkle2D::clear() {
 
   while (tmp != NULL) {
     tmp2 = tmp->next;
-    free(tmp);
+    delete tmp;
     tmp = tmp2;
   }
   sparkle_first = NULL;
@@ -69,7 +67,7 @@ void Sparkle2D::remove_sparkle(Sparkle *sparkle) {
     sparkle->prev->next = sparkle->next;
   else
     sparkle_first = sparkle->next;
-  free(sparkle);
+  delete sparkle;
 }
 
 /*
@@ -78,7 +76,7 @@ void Sparkle2D::remove_sparkle(Sparkle *sparkle) {
 Sparkle *Sparkle2D::create_and_insert() {
   Sparkle *tmp = NULL;
 
-  tmp = (Sparkle *)malloc(sizeof(Sparkle));
+  tmp = new Sparkle;
   if (tmp == NULL) { return (NULL); }
   tmp->next = sparkle_first;
   tmp->prev = NULL;
diff --git a/src/spike.cc b/src/spike.cc
index a181303..5f6aa9c 100644
--- a/src/spike.cc
+++ b/src/spike.cc
@@ -29,7 +29,7 @@
 #include "sound.h"
 
 Spike::Spike(Coord3d position, Real speed, Real phase) {
-  assign(position, this->position);
+  this->position = position;
   this->position[2] = Game::current->map->getHeight(position[0], position[1]) + 0.0;
   this->speed = speed;
   while (phase < 0.0) phase += 1.0;
@@ -52,7 +52,7 @@ Spike::Spike(Coord3d position, Real speed, Real phase) {
 int Spike::generateBuffers(GLuint *&idxbufs, GLuint *&databufs) {
   allocateBuffers(1, idxbufs, databufs);
 
-  int nfacets = 6;
+  const int nfacets = 6;
   GLfloat data[(4 * nfacets) * 8];
   ushort idxs[3 * nfacets][3];
 
@@ -199,9 +199,8 @@ void generateSpikeVBO(GLfloat *data, ushort idxs[][3], int nfacets, Matrix3d rot
       normal[1] = d2 * std::cos(angle + M_PI / nfacets);
       normal[2] = d1;
     }
-    Coord3d tlocal, tnormal;
-    useMatrix(rotmtx, local, tlocal);
-    useMatrix(rotmtx, normal, tnormal);
+    Coord3d tlocal = useMatrix(rotmtx, local);
+    Coord3d tnormal = useMatrix(rotmtx, normal);
     GLfloat flocal[3] = {(GLfloat)tlocal[0], (GLfloat)tlocal[1], (GLfloat)tlocal[2]};
     GLfloat fnormal[3] = {(GLfloat)tnormal[0], (GLfloat)tnormal[1], (GLfloat)tnormal[2]};
     pos += packObjectVertex(pos, position[0] + flocal[0], position[1] + flocal[1],
diff --git a/src/switch.cc b/src/switch.cc
index 1437913..1060d50 100644
--- a/src/switch.cc
+++ b/src/switch.cc
@@ -169,9 +169,8 @@ void CSwitch::drawBuffers1(GLuint *idxbufs, GLuint *databufs) {
 void CSwitch::drawBuffers2(GLuint * /*idxbufs*/, GLuint * /*databufs*/) {}
 
 void CSwitch::tick(Real /*t*/) {
-  Coord3d v;
+  Coord3d v = position - Game::current->player1->position;
   Player *player = Game::current->player1;
-  sub(position, Game::current->player1->position, v);
 
   double dist = length(v);
   if (dist < player->radius + 0.3) {
diff --git a/src/teleport.cc b/src/teleport.cc
index a07bdd7..a92cd0d 100644
--- a/src/teleport.cc
+++ b/src/teleport.cc
@@ -219,13 +219,11 @@ void Teleport::drawBuffers2(GLuint *idxbufs, GLuint *databufs) {
 void Teleport::tick(Real /*t*/) {
   position[2] = Game::current->map->getHeight(position[0], position[1]);
   Player *p = Game::current->player1;
-  Coord3d diff;
-
-  sub(position, p->position, diff);
+  Coord3d diff = position - p->position;
   if (length(diff) < p->radius + radius) {
     p->position[0] = dx + .5;
     p->position[1] = dy + .5;
-    p->position[2] = Game::current->map->getHeight(p->position[0], p->position[1]);
+    p->position[2] = Game::current->map->getHeight(p->position[0], p->position[1]) + p->radius;
     // generate a sound for the teleportation
     // playEffect(SFX_TELEPORT);
   }

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/pkg-games/trackballs.git



More information about the Pkg-games-commits mailing list