GSoC 2011: Android port - merged mainstream
authorkoda
Thu, 24 Nov 2011 16:18:45 +0100
changeset 6415 af2047bb4f70
parent 6414 8474b7fa84d6 (diff)
parent 6350 41b0a9955c47 (current diff)
child 6416 850b8dd3e6df
GSoC 2011: Android port - merged mainstream
CMakeLists.txt
hedgewars/PascalExports.pas
hedgewars/SDLh.pas
hedgewars/hwengine.pas
hedgewars/uAI.pas
hedgewars/uCaptions.pas
hedgewars/uCommandHandlers.pas
hedgewars/uFloat.pas
hedgewars/uScript.pas
hedgewars/uSound.pas
hedgewars/uStore.pas
hedgewars/uVariables.pas
hedgewars/uWorld.pas
misc/libtremor/CHANGELOG
misc/libtremor/COPYING
misc/libtremor/Makefile.am
misc/libtremor/README
misc/libtremor/Version_script.in
misc/libtremor/Xcode/Tremor.xcodeproj/default.mode1v3
misc/libtremor/Xcode/Tremor.xcodeproj/default.pbxuser
misc/libtremor/Xcode/Tremor_Prefix.pch
misc/libtremor/asm_arm.h
misc/libtremor/autogen.sh
misc/libtremor/backends.h
misc/libtremor/bitwise.c
misc/libtremor/block.c
misc/libtremor/block.h
misc/libtremor/codebook.c
misc/libtremor/codebook.h
misc/libtremor/codec_internal.h
misc/libtremor/config_types.h
misc/libtremor/configure.in
misc/libtremor/floor0.c
misc/libtremor/floor1.c
misc/libtremor/framing.c
misc/libtremor/info.c
misc/libtremor/ivorbiscodec.h
misc/libtremor/ivorbisfile.h
misc/libtremor/ivorbisfile_example.c
misc/libtremor/lsp_lookup.h
misc/libtremor/mapping0.c
misc/libtremor/mdct.c
misc/libtremor/mdct.h
misc/libtremor/mdct_lookup.h
misc/libtremor/misc.h
misc/libtremor/ogg.h
misc/libtremor/os.h
misc/libtremor/os_types.h
misc/libtremor/registry.c
misc/libtremor/registry.h
misc/libtremor/res012.c
misc/libtremor/sharedbook.c
misc/libtremor/synthesis.c
misc/libtremor/vorbisfile.c
misc/libtremor/window.c
misc/libtremor/window.h
misc/libtremor/window_lookup.h
project_files/HedgewarsMobile/Audio/Music/Art.ogg
project_files/HedgewarsMobile/Audio/Music/Brick.ogg
project_files/HedgewarsMobile/Audio/Music/Castle.ogg
project_files/HedgewarsMobile/Audio/Music/City.ogg
project_files/HedgewarsMobile/Audio/Music/Compost.ogg
project_files/HedgewarsMobile/Audio/Music/Desert.ogg
project_files/HedgewarsMobile/Audio/Music/EarthRise.ogg
project_files/HedgewarsMobile/Audio/Music/Freeway.ogg
project_files/HedgewarsMobile/Audio/Music/Halloween.ogg
project_files/HedgewarsMobile/Audio/Music/Nature.ogg
project_files/HedgewarsMobile/Audio/Music/Olympics.ogg
project_files/HedgewarsMobile/Audio/Music/Rock.ogg
project_files/HedgewarsMobile/Audio/Music/Sheep.ogg
project_files/HedgewarsMobile/Audio/Music/bath.ogg
project_files/HedgewarsMobile/Audio/Music/hell.ogg
project_files/HedgewarsMobile/Audio/Music/oriental.ogg
project_files/HedgewarsMobile/Audio/Music/pirate.ogg
project_files/HedgewarsMobile/Audio/Music/snow.ogg
project_files/HedgewarsMobile/Audio/Music/underwater.ogg
project_files/HedgewarsMobile/Audio/Sounds/1C.ogg
project_files/HedgewarsMobile/Audio/Sounds/2D.ogg
project_files/HedgewarsMobile/Audio/Sounds/3E.ogg
project_files/HedgewarsMobile/Audio/Sounds/4F.ogg
project_files/HedgewarsMobile/Audio/Sounds/5G.ogg
project_files/HedgewarsMobile/Audio/Sounds/6A.ogg
project_files/HedgewarsMobile/Audio/Sounds/7B.ogg
project_files/HedgewarsMobile/Audio/Sounds/8C.ogg
project_files/HedgewarsMobile/Audio/Sounds/9D.ogg
project_files/HedgewarsMobile/Audio/Sounds/BirdyLay.ogg
project_files/HedgewarsMobile/Audio/Sounds/CollectCrate.ogg
project_files/HedgewarsMobile/Audio/Sounds/Droplet1.ogg
project_files/HedgewarsMobile/Audio/Sounds/Droplet2.ogg
project_files/HedgewarsMobile/Audio/Sounds/Droplet3.ogg
project_files/HedgewarsMobile/Audio/Sounds/Hellish.ogg
project_files/HedgewarsMobile/Audio/Sounds/Whistle.ogg
project_files/HedgewarsMobile/Audio/Sounds/Yoohoo.ogg
project_files/HedgewarsMobile/Audio/Sounds/baseballbat.ogg
project_files/HedgewarsMobile/Audio/Sounds/bee.ogg
project_files/HedgewarsMobile/Audio/Sounds/beewater.ogg
project_files/HedgewarsMobile/Audio/Sounds/cake2.ogg
project_files/HedgewarsMobile/Audio/Sounds/denied.ogg
project_files/HedgewarsMobile/Audio/Sounds/drillgun.ogg
project_files/HedgewarsMobile/Audio/Sounds/egg.ogg
project_files/HedgewarsMobile/Audio/Sounds/explosion.ogg
project_files/HedgewarsMobile/Audio/Sounds/graveimpact.ogg
project_files/HedgewarsMobile/Audio/Sounds/grenadeimpact.ogg
project_files/HedgewarsMobile/Audio/Sounds/gun.ogg
project_files/HedgewarsMobile/Audio/Sounds/hell_growl.ogg
project_files/HedgewarsMobile/Audio/Sounds/hell_ooff.ogg
project_files/HedgewarsMobile/Audio/Sounds/hell_ow.ogg
project_files/HedgewarsMobile/Audio/Sounds/hell_ugh.ogg
project_files/HedgewarsMobile/Audio/Sounds/hogchant3.ogg
project_files/HedgewarsMobile/Audio/Sounds/homerun.ogg
project_files/HedgewarsMobile/Audio/Sounds/lowgravity.ogg
project_files/HedgewarsMobile/Audio/Sounds/melonimpact.ogg
project_files/HedgewarsMobile/Audio/Sounds/minetick.ogg
project_files/HedgewarsMobile/Audio/Sounds/molotov.ogg
project_files/HedgewarsMobile/Audio/Sounds/mortar.ogg
project_files/HedgewarsMobile/Audio/Sounds/pickhammer.ogg
project_files/HedgewarsMobile/Audio/Sounds/placed.ogg
project_files/HedgewarsMobile/Audio/Sounds/plane.ogg
project_files/HedgewarsMobile/Audio/Sounds/rcplane.ogg
project_files/HedgewarsMobile/Audio/Sounds/ride_of_the_valkyries.ogg
project_files/HedgewarsMobile/Audio/Sounds/ropeattach.ogg
project_files/HedgewarsMobile/Audio/Sounds/roperelease.ogg
project_files/HedgewarsMobile/Audio/Sounds/ropeshot.ogg
project_files/HedgewarsMobile/Audio/Sounds/shotgunfire.ogg
project_files/HedgewarsMobile/Audio/Sounds/shotgunreload.ogg
project_files/HedgewarsMobile/Audio/Sounds/shutterclick.ogg
project_files/HedgewarsMobile/Audio/Sounds/skip.ogg
project_files/HedgewarsMobile/Audio/Sounds/sniperreload.ogg
project_files/HedgewarsMobile/Audio/Sounds/splash.ogg
project_files/HedgewarsMobile/Audio/Sounds/steam.ogg
project_files/HedgewarsMobile/Audio/Sounds/steps.ogg
project_files/HedgewarsMobile/Audio/Sounds/suddendeath.ogg
project_files/HedgewarsMobile/Audio/Sounds/switchhog.ogg
project_files/HedgewarsMobile/Audio/Sounds/throwpowerup.ogg
project_files/HedgewarsMobile/Audio/Sounds/throwrelease.ogg
project_files/HedgewarsMobile/Audio/Sounds/ufo.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Amazing.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Boring.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Brilliant.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Bugger.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Bungee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Byebye.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Comeonthen.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Coward.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Cutitout.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Drat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Enemydown.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Excellent.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Fire.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Firepunch1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Firstblood.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Flawless.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Gonnagetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Grenade.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Hello.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Hmm.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Hurry.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Illgetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Incoming.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Jump1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Jump2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Jump3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Justyouwait.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Kamikaze.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Laugh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Leavemealone.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Melon.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Missed.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Nooo.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Nutter.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Ohdear.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Ooff1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Ooff2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Ooff3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Oops.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Ouch.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Ow1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Ow2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Ow3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Ow4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Perfect.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Reinforcements.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Revenge.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Runaway.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Sameteam.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Solong.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Stupid.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Takecover.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Thisoneismine.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Traitor.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Uh-oh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Victory.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Watchit.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Watchthis.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Whatthe.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Whoopsee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Yessir.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/British/Youllregretthat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Amazing.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Boring.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Brilliant.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Bugger.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Bungee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Byebye.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Comeonthen.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Coward.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Cutitout.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Drat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Enemydown.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Excellent.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Fire.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Firepunch1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Firepunch2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Firepunch3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Firepunch4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Firepunch5.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Firepunch6.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Firstblood.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Flawless.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Gonnagetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Grenade.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Hello.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Hmm.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Hurry.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Illgetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Incoming.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Jump1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Jump2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Jump3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Justyouwait.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Kamikaze.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Laugh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Leavemealone.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Melon.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Missed.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Nooo.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Nutter.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Ohdear.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Ooff1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Ooff2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Ooff3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Oops.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Ouch.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Ow1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Ow2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Ow3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Ow4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Perfect.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/PoisonCough.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/PoisonMoan.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Reinforcements.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Revenge.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Runaway.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Sameteam.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Solong.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Stupid.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Takecover.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Thisoneismine.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Traitor.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Uh-oh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Victory.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Watchit.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Watchthis.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Whatthe.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Whoopsee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Yessir.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default/Youllregretthat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Amazing.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Boring.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Brilliant.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Bugger.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Bungee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Byebye.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Comeonthen.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Coward.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Cutitout.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Drat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Enemydown.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Excellent.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Fire.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Firepunch1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Firepunch2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Firepunch3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Firepunch4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Firepunch5.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Firepunch6.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Firstblood.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Flawless.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Gonnagetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Grenade.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Hello.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Hmm.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Hurry.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Illgetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Incoming.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Jump1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Jump2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Jump3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/JustYouwait.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Kamikaze.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Laugh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Leavemealone.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Melon.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Missed.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Nooo.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Nutter.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Ohdear.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Ooff1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Ooff2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Ooff3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Oops.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Ouch.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Ow1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Ow2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Ow3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Ow4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Perfect.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/PoisonCough.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/PoisonMoan.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Reinforcements.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Revenge.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Runaway.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Sameteam.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Solong.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Stupid.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Takecover.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Thisoneismine.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Traitor.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Uh-oh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Victory.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Watchit.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Watchthis.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Whatthe.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Whoopsee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Yessir.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Default_uk/Youllregretthat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Amazing.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Boring.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Brilliant.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Bugger.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Bungee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Byebye.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Comeonthen.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Coward.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Cutitout.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Drat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Enemydown.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Excellent.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Fire.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Firepunch1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Firstblood.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Flawless.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Gonnagetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Grenade.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Hello.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Hmm.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Hurry.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Illgetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Incoming.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Jump1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Jump2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Jump3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Justyouwait.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Kamikaze.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Laugh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Leavemealone.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Melon.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Missed.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Nooo.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Nutter.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Ohdear.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Ooff1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Ooff2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Ooff3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Oops.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Ouch.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Ow1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Ow2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Ow3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Ow4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Perfect.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Reinforcements.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Revenge.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Runaway.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Sameteam.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Solong.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Stupid.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Takecover.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Thisoneismine.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Traitor.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Uh-oh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Victory.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Watchit.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Watchthis.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Whatthe.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Whoopsee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Yessir.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Mobster/Youllregretthat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Amazing.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Boring.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Brilliant.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Bugger.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Bungee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Byebye.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Comeonthen.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Coward.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Cutitout.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Drat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Enemydown.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Excellent.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Fire.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Firepunch1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Firepunch2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Firepunch3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Firepunch4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Firepunch5.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Firepunch6.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Firstblood.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Flawless.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Gonnagetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Grenade.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Hello.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Hmm.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Hurry.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Illgetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Incoming.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Jump1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Jump2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Jump3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Justyouwait.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Kamikaze.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Laugh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Leavemealone.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Melon.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Missed.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Nooo.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Nutter.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Ohdear.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Ooff1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Ooff2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Ooff3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Oops.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Ouch.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Ow1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Ow2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Ow3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Ow4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Perfect.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Reinforcements.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Revenge.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Runaway.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Sameteam.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Solong.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Stupid.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Takecover.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Thisoneismine.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Traitor.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Uh-oh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Victory.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Watchit.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Watchthis.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Whatthe.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Whoopsee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Yessir.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Pirate/Youllregretthat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Amazing.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Boring.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Brilliant.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Bugger.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Bungee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Byebye.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Comeonthen.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Coward.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Cutitout.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Drat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Enemydown.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Excellent.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Fire.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Firepunch1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Firepunch2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Firepunch3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Firepunch4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Firepunch5.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Firepunch6.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Firstblood.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Flawless.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Gonnagetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Grenade.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Hello.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Hmm.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Hurry.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Illgetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Incoming.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Jump1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Jump2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Jump3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Justyouwait.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Kamikaze.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Laugh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Leavemealone.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Melon.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Missed.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Nooo.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Nutter.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Ohdear.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Ooff1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Ooff2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Ooff3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Oops.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Ouch.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Ow1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Ow2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Ow3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Ow4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Perfect.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Reinforcements.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Revenge.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Runaway.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Sameteam.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Solong.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Stupid.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Takecover.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Thisoneismine.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Traitor.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Uh-oh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Victory.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Watchit.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Watchthis.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Whatthe.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Whoopsee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Yessir.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Robot/Youllregretthat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Amazing.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Boring.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Brilliant.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Bugger.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Bungee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Byebye.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Comeonthen.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Coward.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Cutitout.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Drat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Enemydown.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Excellent.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Fire.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Firepunch1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Firstblood.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Flawless.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Gonnagetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Grenade.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Hello.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Hmm.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Hurry.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Illgetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Incoming.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Jump1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Jump2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Jump3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Justyouwait.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Kamikaze.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Laugh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Leavemealone.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Melon.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Missed.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Nooo.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Nutter.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Ohdear.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Ooff1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Ooff2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Ooff3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Oops.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Ouch.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Ow1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Ow2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Ow3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Ow4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Perfect.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Reinforcements.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Revenge.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Runaway.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Sameteam.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Solong.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Stupid.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Takecover.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Thisoneismine.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Traitor.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Uh-oh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Victory.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Watchit.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Watchthis.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Whatthe.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Whoopsee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Yessir.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Russian/Youllregretthat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Amazing.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Boring.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Brilliant.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Bugger.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Bungee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Byebye.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Comeonthen.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Coward.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Cutitout.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Drat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Enemydown.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Excellent.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Fire.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Firepunch1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Firepunch2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Firepunch3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Firepunch4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Firepunch5.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Firepunch6.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Firstblood.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Flawless.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/FlawlessPossibility.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Gonnagetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Grenade.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Hello.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Hmm.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Hurry.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Illgetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Incoming.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Jump1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Jump2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Jump3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Justyouwait.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Kamikaze.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Laugh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Leavemealone.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Melon.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Missed.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Nooo.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Nutter.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Ohdear.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Ooff1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Ooff2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Ooff3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Oops.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Ouch.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Ow1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Ow2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Ow3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Ow4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Perfect.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Reinforcements.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Revenge.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Runaway.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Sameteam.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Solong.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Stupid.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Takecover.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Thisoneismine.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Traitor.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Uh-oh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Victory.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/VictoryPossibility.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Watchit.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Watchthis.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Whatthe.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Whoopsee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Yessir.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Singer/Youllregretthat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Amazing.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Boring.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Brilliant.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Bugger.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Bungee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Byebye.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Comeonthen.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Coward.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Cutitout.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Drat.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Enemydown.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Excellent.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Fire.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Firepunch1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Firepunch2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Firepunch3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Firepunch4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Firepunch5.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Firepunch6.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Firstblood.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Flawless.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Gonnagetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Grenade.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Hello.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Hmm.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Hurry.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Illgetyou.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Incoming.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Jump1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Jump2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Jump3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Justyouwait.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Kamikaze.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Laugh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Leavemealone.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Melon.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Missed.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Nooo.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Nutter.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Ohdear.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Ooff1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Ooff2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Ooff3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Oops.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Ouch.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Ow1.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Ow2.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Ow3.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Ow4.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Perfect.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Reinforcements.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Revenge.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Runaway.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Sameteam.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Solong.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Stupid.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Takecover.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Thisoneismine.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Traitor.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Uh-oh.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Victory.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Watchit.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Watchthis.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Whatthe.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Whoopsee.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Yessir.ogg
project_files/HedgewarsMobile/Audio/Sounds/voices/Surfer/Youllregretthat.ogg
project_files/HedgewarsMobile/Audio/Sounds/warp.ogg
project_files/HedgewarsMobile/Audio/Sounds/whipcrack.ogg
project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m
--- a/CMakeLists.txt	Thu Nov 24 13:44:30 2011 +0100
+++ b/CMakeLists.txt	Thu Nov 24 16:18:45 2011 +0100
@@ -42,7 +42,7 @@
 set(CPACK_PACKAGE_VERSION_MAJOR 0)
 set(CPACK_PACKAGE_VERSION_MINOR 9)
 set(CPACK_PACKAGE_VERSION_PATCH 17${version_suffix})
-set(HEDGEWARS_PROTO_VER 40)
+set(HEDGEWARS_PROTO_VER 41)
 set(HEDGEWARS_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
 
 
--- a/ChangeLog.txt	Thu Nov 24 13:44:30 2011 +0100
+++ b/ChangeLog.txt	Thu Nov 24 16:18:45 2011 +0100
@@ -6,6 +6,7 @@
  + New voicepack, Hillbilly
  + More attractive mission screen with previews
  + Chat timestamping, links, input history, tab completion
+ + AI smarter, now uses switch. Also tweaks to mine/crate/barrel rules
  + Customisable chat by dragging a .css file, see file generated by the /saveStyleSheet command
  + Errors/warnings in chat instead of popup boxes
  + Mousewheel to change hog/weapon counts in game creation
@@ -19,6 +20,7 @@
  + Grenades/bazooka/melon pieces/ballgun now kicked by explosions
  + Minor theme optimisation, Optional SkyR
  + Camera follows melon, clusterbomb, gas cloud
+ * More fixes to fullscreen/window resize on non-Linux systems
  * Vertical movement should be restricted for small displays, camera will try less hard to keep hog in centre
  * Keep mouse from jumping around when ammo menu is active
  * Hogs can now move after trapping another hog in a portal loop
@@ -30,7 +32,7 @@
  * Girders no longer make windows in tunnels
  * Prevent some more escaping through border, firepunch, pickhammer
  * Many frontend bugfixes, code cleanup. Crash in game abort, flake clipping, invalid state on room close
- * Many other engine bugfixes.  SDL event crasher, timebox crasher, birdy hang, desync on quits, crash in birdy eggshell, clouds on Deep Space theme, etc
+ * Many other engine bugfixes.  SDL event crasher, timebox crasher, birdy hang, desync on quits, crash in birdy eggshell, hammer + vamp + invuln, clouds on Deep Space theme, etc
 
 0.9.15 -> 0.9.16:
  + In-game chat now supports backspace-repeat and Escape to close the text input area
--- a/QTfrontend/main.cpp	Thu Nov 24 13:44:30 2011 +0100
+++ b/QTfrontend/main.cpp	Thu Nov 24 16:18:45 2011 +0100
@@ -132,20 +132,7 @@
     if (checkForDir(cfgdir->absolutePath()))
     {
         // alternative loading/lookup paths
-        // TODO: Uncomment paths as they're implemented
         checkForDir(cfgdir->absolutePath() + "/Data");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Forts");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Graphics");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Graphics/Flags");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Graphics/Graves");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Graphics/Hats");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Maps");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Missions");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Missions/Campaign");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Missions/Training");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Sounds");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Sounds/voices");
-        //checkForDir(cfgdir->absolutePath() + "/Data/Themes");
 
         // config/save paths
         checkForDir(cfgdir->absolutePath() + "/Demos");
--- a/QTfrontend/ui/page/pagedata.cpp	Thu Nov 24 13:44:30 2011 +0100
+++ b/QTfrontend/ui/page/pagedata.cpp	Thu Nov 24 16:18:45 2011 +0100
@@ -59,7 +59,7 @@
     initPage();
 
     web->setOpenLinks(false);
-    fetchList();
+//    fetchList();
 }
 
 void PageDataDownload::request(const QUrl &url)
--- a/gameServer/CoreTypes.hs	Thu Nov 24 13:44:30 2011 +0100
+++ b/gameServer/CoreTypes.hs	Thu Nov 24 16:18:45 2011 +0100
@@ -79,7 +79,6 @@
     GameInfo
         Data.Sequence.empty
         []
-        []
 
 data RoomInfo =
     RoomInfo
--- a/gameServer/HWProtoInRoomState.hs	Thu Nov 24 13:44:30 2011 +0100
+++ b/gameServer/HWProtoInRoomState.hs	Thu Nov 24 16:18:45 2011 +0100
@@ -179,7 +179,7 @@
             return [
                 ModifyRoom
                     (\r -> r{
-                        gameInfo = Just $ newGameInfo allPlayersRegistered (mapParams rm) (params rm)
+                        gameInfo = Just $ newGameInfo (teams rm) allPlayersRegistered (mapParams rm) (params rm)
                         }
                     ),
                 AnswerClients chans ["RUN_GAME"]
--- a/gameServer/Utils.hs	Thu Nov 24 13:44:30 2011 +0100
+++ b/gameServer/Utils.hs	Thu Nov 24 16:18:45 2011 +0100
@@ -88,6 +88,8 @@
             , (38, "0.9.16-dev")
             , (39, "0.9.16")
             , (40, "0.9.17-dev")
+            , (41, "0.9.17")
+            , (42, "0.9.18-dev")
             ]
 
 askFromConsole :: B.ByteString -> IO B.ByteString
--- a/hedgewars/GSHandlers.inc	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/GSHandlers.inc	Thu Nov 24 16:18:45 2011 +0100
@@ -1300,7 +1300,7 @@
         end
     else
         begin
-        if CheckLandValue(hwRound(Gear^.X), hwRound(Gear^.Y + Gear^.dY + cGravity), lfIndestructible) then
+        if CheckLandValue(hwRound(Gear^.X), hwRound(Gear^.Y + Gear^.dY + cGravity), $FF00) then
             begin
             Gear^.dY := Gear^.dY + cGravity;
             Gear^.Y := Gear^.Y + Gear^.dY
@@ -1309,7 +1309,7 @@
         end;
 
     Gear^.X := Gear^.X + HHGear^.dX;
-    if CheckLandValue(hwRound(Gear^.X), hwRound(Gear^.Y)-cHHRadius, lfIndestructible) then
+    if CheckLandValue(hwRound(Gear^.X), hwRound(Gear^.Y)-cHHRadius, $FF00) then
         begin
         HHGear^.X := Gear^.X;
         HHGear^.Y := Gear^.Y - int2hwFloat(cHHRadius)
@@ -2475,7 +2475,7 @@
     Gear^.doStep := @doStepFirePunchWork;
     DrawTunnel(HHGear^.X - int2hwFloat(cHHRadius), HHGear^.Y + _1, _0_5, _0, cHHRadius * 4, 5);
 
-    AddVoice(TSound(ord(sndFirePunch1) + GetRandom(6)), HHGear^.Hedgehog^.Team^.voicepack)
+    PlaySound(TSound(ord(sndFirePunch1) + GetRandom(6)), HHGear^.Hedgehog^.Team^.voicepack)
 end;
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -3641,7 +3641,7 @@
         begin
         Gear^.Damage:= i;
         //AddCaption('Fuel: '+inttostr(round(Gear^.Health/20))+'%', cWhiteColor, capgrpAmmostate);
-        if Gear^.Tex <> nil then FreeTexture(Gear^.Tex);
+        FreeTexture(Gear^.Tex);
         Gear^.Tex := RenderStringTex(trmsg[sidFuel] + ': ' + inttostr(i) +
                      '%', cWhiteColor, fntSmall)
         end;
@@ -4685,7 +4685,7 @@
         if (i <> Gear^.Damage) and ((GameTicks and $3F) = 0) then
             begin
             Gear^.Damage:= i;
-            if Gear^.Tex <> nil then FreeTexture(Gear^.Tex);
+            FreeTexture(Gear^.Tex);
             Gear^.Tex := RenderStringTex(trmsg[sidFuel] + ': ' + inttostr(i) +
                          '%', cWhiteColor, fntSmall)
             end
@@ -4757,7 +4757,7 @@
         if (i <> Gear^.Damage) and ((GameTicks and $3F) = 0) then
             begin
             Gear^.Damage:= i;
-            if Gear^.Tex <> nil then FreeTexture(Gear^.Tex);
+            FreeTexture(Gear^.Tex);
             Gear^.Tex := RenderStringTex(trmsg[sidFuel] + ': ' + inttostr(i) +
                          '%', cWhiteColor, fntSmall)
             end
@@ -4816,7 +4816,7 @@
         if (tmp^.Kind = gtHedgehog) or (tmp^.Kind = gtMine) or (tmp^.Kind = gtExplosives) then
             begin
             //tmp^.State:= tmp^.State or gstFlatened;
-            ApplyDamage(tmp, CurrentHedgehog, tmp^.Health div 3, dsUnknown);
+            if not tmp^.Invulnerable then ApplyDamage(tmp, CurrentHedgehog, tmp^.Health div 3, dsUnknown);
             //DrawTunnel(tmp^.X, tmp^.Y - _1, _0, _0_5, cHHRadius * 6, cHHRadius * 3);
             tmp2:= AddGear(hwRound(tmp^.X), hwRound(tmp^.Y), gtHammerHit, 0, _0, _0, 0);
             tmp2^.IntersectGear:= tmp;
--- a/hedgewars/HHHandlers.inc	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/HHHandlers.inc	Thu Nov 24 16:18:45 2011 +0100
@@ -771,7 +771,6 @@
    Gear^.dY:= _0;
    Gear^.dX:= _0;
    Gear^.State:= Gear^.State and not gstMoving;
-   while TestCollisionYWithGear(Gear,1) = 0 do Gear^.Y:= Gear^.Y+_1;
    exit
    end;
 isFalling:= (Gear^.dY.isNegative) or not TestCollisionYKick(Gear, 1);
@@ -1094,7 +1093,7 @@
     begin
     if Gear^.Timer = 0 then
         begin
-        Gear^.State:= Gear^.State and not (gstWait or gstLoser or gstWinner or gstAttacked or gstNotKickable);
+        Gear^.State:= Gear^.State and not (gstWait or gstLoser or gstWinner or gstAttacked or gstNotKickable or gstHHChooseTarget);
         Gear^.Active:= false;
         AddGearCI(Gear);
         exit
@@ -1131,7 +1130,7 @@
 if (Gear^.Message and (gmAllStoppable or gmLJump or gmHJump) = 0) and
    (Gear^.State and (gstHHJumping or gstHHHJump or gstAttacking) = 0) and
    not Gear^.dY.isNegative and
-   (GameTicks mod (100*hwRound(cMaxWindSpeed/(cGravity/2))) = 0) and 
+   (GameTicks mod (100*LongWOrd(hwRound(cMaxWindSpeed*2/cGravity))) = 0) and
    (TestCollisionYwithGear(Gear, 1) and lfIce <> 0) then
     begin
     slope:= CalcSlopeBelowGear(Gear);
--- a/hedgewars/PascalExports.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/PascalExports.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -359,6 +359,12 @@
 begin
     exit(cMaxTeams);
 end;
+
+procedure HW_memoryWarningCallback; cdecl; export;
+begin
+    ReleaseSound(false);
+end;
+
 {$ENDIF}
 
 end.
--- a/hedgewars/SDLh.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/SDLh.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -961,6 +961,7 @@
 function  Mix_PauseMusic(music: PMixMusic): LongInt; cdecl; external SDL_MixerLibName;
 function  Mix_ResumeMusic(music: PMixMusic): LongInt; cdecl; external SDL_MixerLibName;
 function  Mix_HaltChannel(channel: LongInt): LongInt; cdecl; external SDL_MixerLibName;
+function  Mix_HaltMusic: LongInt; cdecl; external SDL_MixerLibName;
 
 function  Mix_FadeInChannelTimed(channel: LongInt; chunk: PMixChunk; loops: LongInt; fadems: LongInt; ticks: LongInt): LongInt; cdecl; external SDL_MixerLibName;
 function  Mix_FadeOutChannel(channel: LongInt; fadems: LongInt): LongInt; cdecl; external SDL_MixerLibName;
--- a/hedgewars/hwengine.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/hwengine.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -389,7 +389,7 @@
     begin
 {$IFDEF ANDROID}GLUnit.init;{$ENDIF}
 {$IFDEF SDL13}uTouch.initModule;{$ENDIF}
-	uAI.initModule;
+        uAI.initModule;
         //uAIActions does not need initialization
         //uAIAmmoTests does not need initialization
         uAIMisc.initModule;
--- a/hedgewars/uAI.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uAI.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -60,6 +60,49 @@
 BestActions.Pos:= 0
 end;
 
+
+
+const cBranchStackSize = 12;
+type TStackEntry = record
+                   WastedTicks: Longword;
+                   MadeActions: TActions;
+                   Hedgehog: TGear;
+                   end;
+
+var Stack: record
+           Count: Longword;
+           States: array[0..Pred(cBranchStackSize)] of TStackEntry;
+           end;
+
+function Push(Ticks: Longword; const Actions: TActions; const Me: TGear; Dir: integer): boolean;
+var bRes: boolean;
+begin
+    bRes:= (Stack.Count < cBranchStackSize) and (Actions.Count < MAXACTIONS - 5);
+    if bRes then
+        with Stack.States[Stack.Count] do
+            begin
+            WastedTicks:= Ticks;
+            MadeActions:= Actions;
+            Hedgehog:= Me;
+            Hedgehog.Message:= Dir;
+            inc(Stack.Count)
+            end;
+    Push:= bRes
+end;
+
+procedure Pop(var Ticks: Longword; var Actions: TActions; var Me: TGear);
+begin
+    dec(Stack.Count);
+    with Stack.States[Stack.Count] do
+        begin
+        Ticks:= WastedTicks;
+        Actions:= MadeActions;
+        Me:= Hedgehog
+        end
+end;
+
+
+
 procedure TestAmmos(var Actions: TActions; Me: PGear; isMoved: boolean);
 var BotLevel: Byte;
     ap: TAttackParams;
@@ -88,6 +131,7 @@
               begin
               BestActions:= Actions;
               inc(BestActions.Score, Score);
+              BestActions.isWalkingToABetterPlace:= false;
 
               if (ap.Angle > 0) then AddAction(BestActions, aia_LookRight, 0, 200, 0, 0)
               else if (ap.Angle < 0) then AddAction(BestActions, aia_LookLeft, 0, 200, 0, 0);
@@ -128,61 +172,23 @@
        end
 end;
 
-procedure Walk(Me: PGear);
+procedure Walk(Me: PGear; var Actions: TActions);
 const FallPixForBranching = cHHRadius * 2 + 8;
-      cBranchStackSize = 12;
-
-type TStackEntry = record
-                   WastedTicks: Longword;
-                   MadeActions: TActions;
-                   Hedgehog: TGear;
-                   end;
-
-var Stack: record
-           Count: Longword;
-           States: array[0..Pred(cBranchStackSize)] of TStackEntry;
-           end;
-
-    function Push(Ticks: Longword; const Actions: TActions; const Me: TGear; Dir: integer): boolean;
-    var bRes: boolean;
-    begin
-    bRes:= (Stack.Count < cBranchStackSize) and (Actions.Count < MAXACTIONS - 5);
-    if bRes then
-       with Stack.States[Stack.Count] do
-            begin
-            WastedTicks:= Ticks;
-            MadeActions:= Actions;
-            Hedgehog:= Me;
-            Hedgehog.Message:= Dir;
-            inc(Stack.Count)
-            end;
-    Push:= bRes
-    end;
-
-    procedure Pop(var Ticks: Longword; var Actions: TActions; var Me: TGear);
-    begin
-    dec(Stack.Count);
-    with Stack.States[Stack.Count] do
-         begin
-         Ticks:= WastedTicks;
-         Actions:= MadeActions;
-         Me:= Hedgehog
-         end
-    end;
-
-var Actions: TActions;
+var
     ticks, maxticks, steps, tmp: Longword;
     BaseRate, BestRate, Rate: integer;
     GoInfo: TGoInfo;
     CanGo: boolean;
     AltMe: TGear;
     BotLevel: Byte;
+    a: TAmmoType;
 begin
 ticks:= 0; // avoid compiler hint
-Actions.Count:= 0;
-Actions.Pos:= 0;
-Actions.Score:= 0;
 Stack.Count:= 0;
+
+for a:= Low(TAmmoType) to High(TAmmoType) do
+    CanUseAmmo[a]:= Assigned(AmmoTests[a].proc) and HHHasAmmo(Me^.Hedgehog^, a);
+
 BotLevel:= Me^.Hedgehog^.BotLevel;
 
 tmp:= random(2) + 1;
@@ -239,6 +245,7 @@
        if Rate > BestRate then
           begin
           BestActions:= Actions;
+          BestActions.isWalkingToABetterPlace:= true;
           BestRate:= Rate;
           Me^.State:= Me^.State or gstAttacked // we have better place, go there and do not use ammo
           end
@@ -255,41 +262,84 @@
 
 function Think(Me: Pointer): ptrint;
 var BackMe, WalkMe: TGear;
-    StartTicks: Longword;
+    StartTicks, currHedgehogIndex, itHedgehog, switchesNum, i: Longword;
+    switchImmediatelyAvailable, switchAvailable: boolean;
+    Actions: TActions;
 begin
 InterlockedIncrement(hasThread);
 StartTicks:= GameTicks;
-BackMe:= PGear(Me)^;
+currHedgehogIndex:= CurrentTeam^.CurrHedgehog;
+itHedgehog:= currHedgehogIndex;
+switchesNum:= 0;
+
+switchImmediatelyAvailable:= (CurAmmoGear <> nil) and (CurAmmoGear^.Kind = gtSwitcher);
+switchAvailable:= HHHasAmmo(PGear(Me)^.Hedgehog^, amSwitch);
 
 if (PGear(Me)^.State and gstAttacked) = 0 then
    if Targets.Count > 0 then
       begin
+        // iterate over current team hedgehogs
+        repeat
+            WalkMe:= CurrentTeam^.Hedgehogs[itHedgehog].Gear^;
 
-      WalkMe:= BackMe;
-      Walk(@WalkMe);
-      if (StartTicks > GameTicks - 1500) and (not StopThinking) then SDL_Delay(1000);
-      if BestActions.Score < -1023 then
-         begin
-         BestActions.Count:= 0;
-         AddAction(BestActions, aia_Skip, 0, 250, 0, 0);
-         end;
+            Actions.Count:= 0;
+            Actions.Pos:= 0;
+            Actions.Score:= 0;
+            if switchesNum > 0 then
+                begin
+                if not switchImmediatelyAvailable then
+                    begin
+                    // when AI has to use switcher, make it cost smth
+                    Actions.Score:= -20000;
+                    AddAction(Actions, aia_Weapon, Longword(amSwitch), 300 + random(200), 0, 0);                    
+                    AddAction(Actions, aia_attack, aim_push, 300 + random(300), 0, 0);
+                    AddAction(Actions, aia_attack, aim_release, 1, 0, 0);
+                    end;
+                for i:= 1 to switchesNum do
+                    AddAction(Actions, aia_Switch, 0, 300 + random(200), 0, 0);
+                end;
+            Walk(@WalkMe, Actions);
+
+            // find another hog in team
+            repeat
+                itHedgehog:= Succ(itHedgehog) mod CurrentTeam^.HedgehogsNumber;
+            until (itHedgehog = currHedgehogIndex) or (CurrentTeam^.Hedgehogs[itHedgehog].Gear <> nil);
+
+            inc(switchesNum);
+        until (not (switchImmediatelyAvailable or switchAvailable))
+            or StopThinking 
+            or (itHedgehog = currHedgehogIndex)
+            or BestActions.isWalkingToABetterPlace;
+
+        if (StartTicks > GameTicks - 1500) and (not StopThinking) then SDL_Delay(1000);
+
+        if (BestActions.Score < -1023) and (not BestActions.isWalkingToABetterPlace) then
+            begin
+            BestActions.Count:= 0;
+            AddAction(BestActions, aia_Skip, 0, 250, 0, 0);
+            end;
+
       end else
 else begin
-      while (not StopThinking) and (BestActions.Count = 0) do
-            begin
-            FillBonuses(true);
-            WalkMe:= BackMe;
-            Walk(@WalkMe);
-            if not StopThinking then SDL_Delay(100)
-            end
-      end;
+    BackMe:= PGear(Me)^;
+    while (not StopThinking) and (BestActions.Count = 0) do
+        begin
+        FillBonuses(true);
+        WalkMe:= BackMe;
+        Actions.Count:= 0;
+        Actions.Pos:= 0;
+        Actions.Score:= 0;
+        Walk(@WalkMe, Actions);
+        if not StopThinking then SDL_Delay(100)
+        end
+    end;
+
 PGear(Me)^.State:= PGear(Me)^.State and not gstHHThinking;
 Think:= 0;
 InterlockedDecrement(hasThread)
 end;
 
 procedure StartThink(Me: PGear);
-var a: TAmmoType;
 begin
 if ((Me^.State and (gstAttacking or gstHHJumping or gstMoving)) <> 0)
    or isInMultiShoot then exit;
@@ -301,6 +351,7 @@
 BestActions.Count:= 0;
 BestActions.Pos:= 0;
 BestActions.Score:= Low(LongInt);
+BestActions.isWalkingToABetterPlace:= false;
 
 StopThinking:= false;
 ThinkingHH:= Me;
@@ -313,8 +364,6 @@
    end;
 
 FillBonuses((Me^.State and gstAttacked) <> 0);
-for a:= Low(TAmmoType) to High(TAmmoType) do
-    CanUseAmmo[a]:= Assigned(AmmoTests[a].proc) and HHHasAmmo(Me^.Hedgehog^, a);
 AddFileLog('Enter Think Thread');
 {$IFDEF IPHONEOS}
 //TODO: sdl_thread works on device but crashes in simulator, most likely because of outdated toolchain
--- a/hedgewars/uAIActions.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uAIActions.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -30,6 +30,7 @@
       aia_attack     = 4;
       aia_Up         = 5;
       aia_Down       = 6;
+      aia_Switch     = 7;
 
       aia_Weapon     = $8000;
       aia_WaitXL     = $8001;
@@ -56,6 +57,7 @@
                 Count, Pos: Longword;
                 actions: array[0..Pred(MAXACTIONS)] of TAction;
                 Score: LongInt;
+                isWalkingToABetterPlace: boolean;
                 end;
 
 procedure AddAction(var Actions: TActions; Action: Longword; Param: LongInt; TimeDelta: Longword; X, Y: LongInt);
@@ -64,14 +66,15 @@
 implementation
 uses uAIMisc, uAI, uAmmos, uVariables, uCommands, uUtils, uDebug, uIO;
 
-const ActionIdToStr: array[0..6] of string[16] = (
+const ActionIdToStr: array[0..7] of string[16] = (
 {aia_none}           '',
 {aia_Left}           'left',
 {aia_Right}          'right',
 {aia_Timer}          'timer',
 {aia_attack}         'attack',
 {aia_Up}             'up',
-{aia_Down}           'down'
+{aia_Down}           'down',
+{aia_Switch}         'switch'
                      );
 
 {$IFDEF TRACEAIACTIONS}
--- a/hedgewars/uAIMisc.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uAIMisc.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -143,10 +143,11 @@
 // avoid mines unless they are very likely to be duds, or are duds. also avoid if they are about to blow 
           gtMine:  if ((Gear^.State and gstAttacking) = 0) and 
                       (((cMineDudPercent < 90) and (Gear^.Health <> 0)) or
-                       ((Gear^.Health = 0) and (Gear^.Damage > 30))) then
+                       (isAfterAttack and (Gear^.Health = 0) and (Gear^.Damage > 30))) then
                           AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 50, -50)
                       else if (Gear^.State and gstAttacking) <> 0 then
                           AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 100, -50); // mine is on
+          gtExplosives: if isAfterAttack then AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 75, -60+Gear^.Health);
           gtSMine:    AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 50, -30);
           gtDynamite: AddBonus(hwRound(Gear^.X), hwRound(Gear^.Y), 150, -75);
           gtHedgehog: begin
--- a/hedgewars/uCaptions.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uCaptions.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -25,6 +25,7 @@
 
 procedure AddCaption(s: shortstring; Color: Longword; Group: TCapGroup);
 procedure DrawCaptions;
+procedure ReloadCaptions(unload: boolean);
 
 procedure initModule;
 procedure freeModule;
@@ -35,17 +36,26 @@
 type TCaptionStr = record
                    Tex: PTexture;
                    EndTime: LongWord;
+                   Text: shortstring;
+                   Color: Longword
                    end;
 var
     Captions: array[TCapGroup] of TCaptionStr;
 
 procedure AddCaption(s: shortstring; Color: Longword; Group: TCapGroup);
 begin
-    if Captions[Group].Tex <> nil then
+    if Captions[Group].Text <> s then
+        begin
         FreeTexture(Captions[Group].Tex);
-    Captions[Group].Tex:= nil;
-
-    Captions[Group].Tex:= RenderStringTex(s, Color, fntBig);
+        Captions[Group].Tex:= nil
+        end;
+    
+    if Captions[Group].Tex = nil then
+        begin
+        Captions[Group].Color:= Color;
+        Captions[Group].Text:= s;
+        Captions[Group].Tex:= RenderStringTex(s, Color, fntBig)
+        end;
 
     case Group of
         capgrpGameState: Captions[Group].EndTime:= RealTicks + 2200
@@ -54,6 +64,16 @@
     end;
 end;
 
+// For uStore texture recreation
+procedure ReloadCaptions(unload: boolean);
+var Group: TCapGroup;
+begin
+for Group:= Low(TCapGroup) to High(TCapGroup) do
+    if unload then FreeTexture(Captions[Group].Tex)
+    else if Captions[Group].Text <> '' then
+        Captions[Group].Tex:= RenderStringTex(Captions[Group].Text, Captions[Group].Color, fntBig)
+end;
+
 procedure DrawCaptions;
 var
     grp: TCapGroup;
@@ -68,16 +88,17 @@
     for grp:= Low(TCapGroup) to High(TCapGroup) do
         with Captions[grp] do
             if Tex <> nil then
-            begin
+                begin
                 DrawCentered(0, offset, Tex);
                 inc(offset, Tex^.h + 2);
                 if EndTime <= RealTicks then
-                begin
+                    begin
                     FreeTexture(Tex);
                     Tex:= nil;
+                    Text:= '';
                     EndTime:= 0
+                    end;
                 end;
-            end;
 end;
 
 procedure initModule;
@@ -86,13 +107,13 @@
 end;
 
 procedure freeModule;
-var
-    group: TCapGroup;
+var group: TCapGroup;
 begin
     for group:= Low(TCapGroup) to High(TCapGroup) do
-    begin
+        begin
         FreeTexture(Captions[group].Tex);
-    end;
+        Captions[group].Tex:= nil
+        end
 end;
 
 end.
--- a/hedgewars/uChat.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uChat.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -24,6 +24,7 @@
 
 procedure initModule;
 procedure freeModule;
+procedure ReloadLines;
 
 procedure AddChatString(s: shortstring);
 procedure DrawChat;
@@ -72,15 +73,15 @@
 cl.s:= str;
 
 if isInput then
-begin
+    begin
     color:= colors[#6];
     str:= UserNick + '> ' + str + '_'
-end
+    end
 else
-begin
+    begin
     color:= colors[str[1]];
     delete(str, 1, 1)
-end;
+    end;
 
 font:= CheckCJKFont(str, fnt16);
 w:= 0; h:= 0; // avoid compiler hints
@@ -99,6 +100,20 @@
 SDL_FreeSurface(resSurface)
 end;
 
+// For uStore texture recreation
+procedure ReloadLines;
+var i, t: LongWord;
+begin
+    if InputStr.s <> '' then SetLine(InputStr, InputStr.s, true);
+    for i:= 0 to MaxStrIndex do
+        if Strs[i].s <> '' then
+            begin
+            t:= Strs[i].Time;
+            SetLine(Strs[i], Strs[i].s, false);
+            Strs[i].Time:= t
+            end;
+end;
+
 procedure AddChatString(s: shortstring);
 begin
 if not ChatReady then
@@ -370,20 +385,14 @@
     missedCount:= 0;
 
     inputStr.Tex := nil;
-    for i:= 0 to MaxStrIndex do
-    begin
-        Strs[i].Tex := nil;
-    end;
+    for i:= 0 to MaxStrIndex do Strs[i].Tex := nil;
 end;
 
 procedure freeModule;
 var i: ShortInt;
 begin
     FreeTexture(InputStr.Tex);
-    for i:= 0 to MaxStrIndex do
-    begin
-        FreeTexture(Strs[i].Tex);
-    end;
+    for i:= 0 to MaxStrIndex do FreeTexture(Strs[i].Tex);
 end;
 
 end.
--- a/hedgewars/uCommandHandlers.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uCommandHandlers.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -453,8 +453,16 @@
 begin
 if isDeveloperMode then
     begin
-    UserPathz[ptMapCurrent]:= UserPathz[ptMaps] + '/' + s;
-    Pathz[ptMapCurrent]:= Pathz[ptMaps] + '/' + s;
+    if s = '' then
+        begin
+        UserPathz[ptMapCurrent]:= s;
+        Pathz[ptMapCurrent]:= s;
+        end
+    else
+        begin
+        UserPathz[ptMapCurrent]:= UserPathz[ptMaps] + '/' + s;
+        Pathz[ptMapCurrent]:= Pathz[ptMaps] + '/' + s;
+        end;
     InitStepsFlags:= InitStepsFlags or cifMap
     end;
 
--- a/hedgewars/uFloat.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uFloat.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -62,7 +62,7 @@
 
 // The implemented operators
 
-operator = (const z1, z2: hwFloat) z:boolean; inline;
+operator = (const z1, z2: hwFloat) z : boolean; inline;
 operator + (const z1, z2: hwFloat) z : hwFloat; inline;
 operator - (const z1, z2: hwFloat) z : hwFloat; inline;
 operator - (const z1: hwFloat) z : hwFloat; inline;
@@ -202,7 +202,7 @@
 if i.isNegative then hwFloat2Float:= -hwFloat2Float;
 end;
 
-operator = (const z1, z2: hwFloat) z:boolean; inline;
+operator = (const z1, z2: hwFloat) z : boolean; inline;
 begin
     z:= (z1.isNegative = z2.isNegative) and (z1.QWordValue = z2.QWordValue);
 end;
--- a/hedgewars/uGears.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uGears.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -591,11 +591,8 @@
 
 DeleteCI(Gear);
 
-if Gear^.Tex <> nil then
-    begin
-    FreeTexture(Gear^.Tex);
-    Gear^.Tex:= nil
-    end;
+FreeTexture(Gear^.Tex);
+Gear^.Tex:= nil;
 
 // make sure that portals have their link removed before deletion
 if (Gear^.Kind = gtPortal) then
@@ -660,7 +657,7 @@
             with CurrentHedgehog^ do 
                 begin
                 inc(Team^.stats.AIKills);
-                if Team^.AIKillsTex <> nil then FreeTexture(Team^.AIKillsTex);
+                FreeTexture(Team^.AIKillsTex);
                 Team^.AIKillsTex := RenderStringTex(inttostr(Team^.stats.AIKills), Team^.Clan^.Color, fnt16);
                 end
         end;
@@ -803,7 +800,7 @@
         begin
         if Gear^.RenderTimer and (Gear^.Timer > 500) and ((Gear^.Timer mod 1000) = 0) then
             begin
-            if Gear^.Tex <> nil then FreeTexture(Gear^.Tex);
+            FreeTexture(Gear^.Tex);
             Gear^.Tex:= RenderStringTex(inttostr(Gear^.Timer div 1000), cWhiteColor, fntSmall);
             end;
         Gear^.doStep(Gear);
@@ -1684,7 +1681,7 @@
         with CurrentHedgehog^ do 
             begin
             inc(Team^.stats.AIKills);
-            if Team^.AIKillsTex <> nil then FreeTexture(Team^.AIKillsTex);
+            FreeTexture(Team^.AIKillsTex);
             Team^.AIKillsTex := RenderStringTex(inttostr(Team^.stats.AIKills), Team^.Clan^.Color, fnt16);
             end;
     tempTeam := gear^.Hedgehog^.Team;
--- a/hedgewars/uLandGraphics.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uLandGraphics.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -233,7 +233,7 @@
                begin
                by:= t div 2; bx:= i div 2;
                end;
-           if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then
+           if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then
                begin
                inc(cnt);
                LandPixels[by, bx]:= LandBackPixel(i, t)
@@ -255,7 +255,7 @@
                begin
                by:= t div 2; bx:= i div 2;
                end;
-           if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then
+           if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then
                begin
                inc(cnt);
                LandPixels[by, bx]:= LandBackPixel(i, t)
@@ -277,7 +277,7 @@
                begin
                by:= t div 2; bx:= i div 2;
                end;
-           if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then
+           if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then
                begin
                inc(cnt);
                LandPixels[by, bx]:= LandBackPixel(i, t)
@@ -298,7 +298,7 @@
                begin
                by:= t div 2; bx:= i div 2;
                end;
-           if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then
+           if ((Land[t, i] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not (disableLandBack) then
                begin
                inc(cnt);
                LandPixels[by, bx]:= LandBackPixel(i, t)
@@ -468,7 +468,7 @@
                     begin
                     by:= ty div 2; bx:= tx div 2;
                     end;
-                if ((Land[ty, tx] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then
+                if ((Land[ty, tx] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then
                     LandPixels[by, bx]:= LandBackPixel(tx, ty)
                 else if ((Land[ty, tx] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then 
                     LandPixels[by, bx]:= 0
@@ -588,7 +588,7 @@
                 begin
                 by:= ty div 2; bx:= tx div 2;
                 end;
-            if ((Land[ty, tx] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and not disableLandBack then
+            if ((Land[ty, tx] and lfBasic) <> 0) and (((LandPixels[by,bx] and AMask) shr AShift) = 255) and (not disableLandBack) then
                 LandPixels[by, bx]:= LandBackPixel(tx, ty)
             else if ((Land[ty, tx] and lfObject) <> 0) or (((LandPixels[by,bx] and AMask) shr AShift) < 255) then
                 LandPixels[by, bx]:= 0;
--- a/hedgewars/uLandTexture.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uLandTexture.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -31,7 +31,7 @@
 implementation
 uses uConsts, GLunit, uTypes, uVariables, uTextures, uDebug, uRender;
 
-const TEXSIZE = 256;
+const TEXSIZE = 512;
 
 type TLandRecord = record
             shouldUpdate: boolean;
@@ -139,11 +139,11 @@
 procedure ResetLand;
 var x, y: LongInt;
 begin
-    for x:= 0 to LANDTEXARW -1 do
+    for x:= 0 to LANDTEXARW - 1 do
         for y:= 0 to LANDTEXARH - 1 do
             with LandTextures[x, y] do
                 begin
-                if tex <> nil then FreeTexture(tex);
+                FreeTexture(tex);
                 tex:= nil;
                 end;
 end;
--- a/hedgewars/uRender.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uRender.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -45,8 +45,6 @@
 procedure Tint(r, g, b, a: Byte); inline;
 procedure Tint(c: Longword); inline;
 
-var
-    HHTexture: PTexture;
 
 implementation
 uses uVariables;
--- a/hedgewars/uScript.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uScript.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -728,7 +728,7 @@
             gear^.Hedgehog^.Name:= hogName;
 
 	    FreeTexture(gear^.Hedgehog^.NameTagTex);
-            gear^.Hedgehog^.NameTagTex:= RenderStringTex(gear^.Hedgehog^.Name, gear^.Hedgehog^.Team^.Clan^.Color, fnt16);
+        gear^.Hedgehog^.NameTagTex:= RenderStringTex(gear^.Hedgehog^.Name, gear^.Hedgehog^.Team^.Clan^.Color, fnt16);
 
         end;
     lc_sethogname:= 0;
@@ -1619,7 +1619,7 @@
 ScriptSetInteger('SuddenDeathTurns', cSuddenDTurns);
 ScriptSetInteger('WaterRise', cWaterRise);
 ScriptSetInteger('HealthDecrease', cHealthDecrease);
-ScriptSetString('Map', '');
+ScriptSetString('Map', 'CHANGE_ME');
 ScriptSetString('Theme', '');
 ScriptSetString('Goals', '');
 
@@ -1645,7 +1645,7 @@
 cWaterRise       := ScriptGetInteger('WaterRise');
 cHealthDecrease  := ScriptGetInteger('HealthDecrease');
 
-if ScriptGetString('Map') <> '' then
+if ScriptGetString('Map') <> 'CHANGE_ME' then
     ParseCommand('map ' + ScriptGetString('Map'), true);
 if ScriptGetString('Theme') <> '' then
     ParseCommand('theme ' + ScriptGetString('Theme'), true);
--- a/hedgewars/uSound.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uSound.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -41,7 +41,7 @@
 procedure freeModule;
 
 procedure InitSound; // Initiates sound-system if isSoundEnabled.
-procedure ReleaseSound; // Releases sound-system and used resources.
+procedure ReleaseSound(complete: boolean); // Releases sound-system and used resources.
 procedure SoundLoad; // Preloads some sounds for performance reasons.
 
 
@@ -176,24 +176,41 @@
     ChangeVolume(cInitVolume)
 end;
 
-procedure ReleaseSound;
+// when complete is false, this procedure just releases some of the chucks on inactive channels
+// this way music is not stopped, nor are chucks currently being plauyed
+procedure ReleaseSound(complete: boolean);
 var i: TSound;
     t: Longword;
 begin
+    // release and nil all sounds
     for t:= 0 to cMaxTeams do
         if voicepacks[t].name <> '' then
             for i:= Low(TSound) to High(TSound) do
                 if voicepacks[t].chunks[i] <> nil then
-                    Mix_FreeChunk(voicepacks[t].chunks[i]);
-
-    if Mus <> nil then
-        Mix_FreeMusic(Mus);
+                    if complete or (Mix_Playing(lastChan[i]) = 0) then
+                        begin
+                        Mix_HaltChannel(lastChan[i]);
+                        lastChan[i]:= -1;
+                        Mix_FreeChunk(voicepacks[t].chunks[i]);
+                        voicepacks[t].chunks[i]:= nil;
+                        end;
 
-    // make sure all instances of sdl_mixer are unloaded before continuing
-    while Mix_Init(0) <> 0 do
-        Mix_Quit();
+    // stop music
+    if complete then
+        begin
+        if Mus <> nil then
+            begin
+            Mix_HaltMusic();
+            Mix_FreeMusic(Mus);
+            Mus:= nil;
+            end;
 
-    Mix_CloseAudio();
+        // make sure all instances of sdl_mixer are unloaded before continuing
+        while Mix_Init(0) <> 0 do
+            Mix_Quit();
+
+        Mix_CloseAudio();
+        end;
 end;
 
 procedure SoundLoad;
@@ -205,15 +222,16 @@
 
     defVoicepack:= AskForVoicepack('Default');
 
+    // initialize all voices to nil so that they can be loaded when needed
     for t:= 0 to cMaxTeams do
         if voicepacks[t].name <> '' then
             for i:= Low(TSound) to High(TSound) do
                 voicepacks[t].chunks[i]:= nil;
 
+    // preload all the big sound files (>32k) that would otherwise lockup the game
     for i:= Low(TSound) to High(TSound) do
     begin
         defVoicepack^.chunks[i]:= nil;
-        // preload all the big sound files (>32k) that would otherwise lockup the game
         if (i in [sndBeeWater, sndBee, sndCake, sndHellishImpact1, sndHellish, sndHomerun,
                   sndMolotov, sndMortar, sndRideOfTheValkyries, sndYoohoo])
             and (Soundz[i].Path <> ptVoices) and (Soundz[i].FileName <> '') then
@@ -287,6 +305,13 @@
 var i : LongInt;
 begin
     if (not isSoundEnabled) or fastUntilLag or ((LastVoice.snd = snd) and  (LastVoice.voicepack = voicepack)) then exit;
+    if (snd = sndVictory) or (snd = sndFlawless) then
+        begin
+        Mix_FadeOutChannel(-1, 800);
+        for i:= 0 to 7 do VoiceList[i].snd:= sndNone;
+        LastVoice.snd:= sndNone;
+        end;
+
     i:= 0;
     while (i<8) and (VoiceList[i].snd <> sndNone) do inc(i);
 
@@ -473,7 +498,7 @@
 procedure freeModule;
 begin
     if isSoundEnabled then
-        ReleaseSound();
+        ReleaseSound(true);
 end;
 
 end.
--- a/hedgewars/uStore.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uStore.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -21,7 +21,7 @@
 
 unit uStore;
 interface
-uses sysutils, uConsts, SDLh, GLunit, uTypes, uLandTexture;
+uses sysutils, uConsts, SDLh, GLunit, uTypes, uLandTexture, uCaptions, uChat;
 
 procedure initModule;
 procedure freeModule;
@@ -42,7 +42,7 @@
 procedure MakeCrossHairs;
 
 implementation
-uses uMisc, uConsole, uMobile, uVariables, uUtils, uTextures, uRender, uRenderUtils, uCommands, uDebug;
+uses uMisc, uConsole, uMobile, uVariables, uUtils, uTextures, uRender, uRenderUtils, uCommands, uDebug, uWorld;
 
 //type TGPUVendor = (gvUnknown, gvNVIDIA, gvATI, gvIntel, gvApple);
 
@@ -110,7 +110,7 @@
     if SDL_MustLock(texsurf) then
         SDL_UnlockSurface(texsurf);
 
-    if CrosshairTex <> nil then FreeTexture(CrosshairTex);
+    FreeTexture(CrosshairTex);
     CrosshairTex:= Surface2Tex(texsurf, false);
     SDL_FreeSurface(texsurf)
     end;
@@ -277,8 +277,9 @@
 WriteNames(fnt16);
 MakeCrossHairs;
 LoadGraves;
+if not reload then
+    AddProgress;
 
-AddProgress;
 for ii:= Low(TSprite) to High(TSprite) do
     with SpritesData[ii] do
         // FIXME - add a sprite attribute to match on rq flags?
@@ -358,7 +359,8 @@
                 Surface:= nil
         end;
 
-AddProgress;
+if not reload then
+    AddProgress;
 
 tmpsurf:= LoadImage(UserPathz[ptGraphics] + '/' + cHHFileName, ifAlpha or ifTransparent);
 if tmpsurf = nil then tmpsurf:= LoadImage(Pathz[ptGraphics] + '/' + cHHFileName, ifAlpha or ifCritical or ifTransparent);
@@ -371,34 +373,34 @@
 ConfirmTexture:= RenderStringTex(trmsg[sidConfirm], cYellowColor, fntBig);
 SyncTexture:= RenderStringTex(trmsg[sidSync], cYellowColor, fntBig);
 
-AddProgress;
+if not reload then
+    AddProgress;
 
 // name of weapons in ammo menu
 for ai:= Low(TAmmoType) to High(TAmmoType) do
     with Ammoz[ai] do
-    begin
+        begin
         TryDo(trAmmo[NameId] <> '','No default text/translation found for ammo type #' + intToStr(ord(ai)) + '!',true);
         tmpsurf:= TTF_RenderUTF8_Blended(Fontz[CheckCJKFont(trAmmo[NameId],fnt16)].Handle, Str2PChar(trAmmo[NameId]), cWhiteColorChannels);
         TryDo(tmpsurf <> nil,'Name-texture creation for ammo type #' + intToStr(ord(ai)) + ' failed!',true);
         tmpsurf:= doSurfaceConversion(tmpsurf);
-        if (NameTex <> nil) then
-            FreeTexture(NameTex);
+        FreeTexture(NameTex);
         NameTex:= Surface2Tex(tmpsurf, false);
         SDL_FreeSurface(tmpsurf)
-    end;
+        end;
 
 // number of weapons in ammo menu
 for i:= Low(CountTexz) to High(CountTexz) do
 begin
     tmpsurf:= TTF_RenderUTF8_Blended(Fontz[fnt16].Handle, Str2PChar(IntToStr(i) + 'x'), cWhiteColorChannels);
     tmpsurf:= doSurfaceConversion(tmpsurf);
-    if (CountTexz[i] <> nil) then
-        FreeTexture(CountTexz[i]);
+    FreeTexture(CountTexz[i]);
     CountTexz[i]:= Surface2Tex(tmpsurf, false);
     SDL_FreeSurface(tmpsurf)
 end;
 
-AddProgress;
+if not reload then
+    AddProgress;
 IMG_Quit();
 end;
 
@@ -418,16 +420,21 @@
             end
         end;
     SDL_FreeSurface(MissionIcons);
+
+    // free the textures declared in uVariables
+    FreeTexture(WeaponTooltipTex);
+    WeaponTooltipTex:= nil;
+    FreeTexture(PauseTexture);
+    PauseTexture:= nil;
+    FreeTexture(SyncTexture);
+    SyncTexture:= nil;
+    FreeTexture(ConfirmTexture);
+    ConfirmTexture:= nil;
     FreeTexture(ropeIconTex);
     ropeIconTex:= nil;
     FreeTexture(HHTexture);
     HHTexture:= nil;
-    FreeTexture(PauseTexture);
-    PauseTexture:= nil;
-    FreeTexture(ConfirmTexture);
-    ConfirmTexture:= nil;
-    FreeTexture(SyncTexture);
-    SyncTexture:= nil;
+
     // free all ammo name textures
     for ai:= Low(TAmmoType) to High(TAmmoType) do
         begin
@@ -444,9 +451,9 @@
 
     // free all team and hedgehog textures
     for t:= 0 to Pred(TeamsCount) do
-    begin
+        begin
         if TeamsArray[t] <> nil then
-        begin
+            begin
             FreeTexture(TeamsArray[t]^.NameTagTex);
             TeamsArray[t]^.NameTagTex:= nil;
             FreeTexture(TeamsArray[t]^.CrosshairTex);
@@ -460,26 +467,26 @@
             FreeTexture(TeamsArray[t]^.FlagTex);
             TeamsArray[t]^.FlagTex:= nil;
             for i:= 0 to cMaxHHIndex do
-            begin
+                begin
                 FreeTexture(TeamsArray[t]^.Hedgehogs[i].NameTagTex);
                 TeamsArray[t]^.Hedgehogs[i].NameTagTex:= nil;
                 FreeTexture(TeamsArray[t]^.Hedgehogs[i].HealthTagTex);
                 TeamsArray[t]^.Hedgehogs[i].HealthTagTex:= nil;
                 FreeTexture(TeamsArray[t]^.Hedgehogs[i].HatTex);
                 TeamsArray[t]^.Hedgehogs[i].HatTex:= nil;
+                end;
             end;
         end;
-    end;
 {$IFNDEF S3D_DISABLED}
     if (cStereoMode = smHorizontal) or (cStereoMode = smVertical) or (cStereoMode = smAFR) then
-    begin
+        begin
         glDeleteTextures(1, @texl);
         glDeleteRenderbuffersEXT(1, @depthl);
         glDeleteFramebuffersEXT(1, @framel);
         glDeleteTextures(1, @texr);
         glDeleteRenderbuffersEXT(1, @depthr);
         glDeleteFramebuffersEXT(1, @framer)
-    end
+        end
 {$ENDIF}
 end;
 
@@ -488,8 +495,7 @@
 var s: shortstring;
 begin
     str(Hedgehog.Gear^.Health, s);
-    if Hedgehog.HealthTagTex <> nil then
-        FreeTexture(Hedgehog.HealthTagTex);
+    FreeTexture(Hedgehog.HealthTagTex);
     Hedgehog.HealthTagTex:= RenderStringTex(s, Hedgehog.Team^.Clan^.Color, fnt16)
 end;
 
@@ -763,9 +769,10 @@
 
 procedure FinishProgress;
 begin
+    uMobile.GameLoaded();
     WriteLnToConsole('Freeing progress surface... ');
     FreeTexture(ProgrTex);
-    uMobile.GameLoaded();
+    ProgrTex:= nil;
     Step:= 0
 end;
 
@@ -938,8 +945,6 @@
 procedure FreeWeaponTooltip;
 begin
 // free the existing texture (if there is any)
-if WeaponTooltipTex = nil then
-    exit;
 FreeTexture(WeaponTooltipTex);
 WeaponTooltipTex:= nil
 end;
@@ -978,6 +983,10 @@
         SetScale(cDefaultZoomLevel);
 {$IF DEFINED(DARWIN) OR DEFINED(WIN32)}
         reinit:= true;
+        StoreRelease(true);
+        ResetLand;
+        ResetWorldTex;
+        //uTextures.freeModule; //DEBUG ONLY
 {$ENDIF}
         AddFileLog('Freeing old primary surface...');
         SDL_FreeSurface(SDLPrimSurface);
@@ -1032,18 +1041,20 @@
     SetupOpenGL();
     if reinit then
         begin
+        // clean the window from any previous content
+        glClear(GL_COLOR_BUFFER_BIT);
         if SuddenDeathDmg then
              glClearColor(SDSkyColor.r * (SDTint/255) / 255, SDSkyColor.g * (SDTint/255) / 255, SDSkyColor.b * (SDTint/255) / 255, 0.99)
         else if ((cReducedQuality and rqNoBackground) = 0) then 
              glClearColor(SkyColor.r / 255, SkyColor.g / 255, SkyColor.b / 255, 0.99)
         else glClearColor(RQSkyColor.r / 255, RQSkyColor.g / 255, RQSkyColor.b / 255, 0.99);
 
-        StoreRelease(true);
+        // reload everything we had before
+        ReloadCaptions(false);
+        ReloadLines;
         StoreLoad(true);
-
-        ResetLand;
-
-        UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT)
+        // redraw all land
+        UpdateLandTexture(0, LAND_WIDTH, 0, LAND_HEIGHT);
         end;
 end;
 
--- a/hedgewars/uTextures.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uTextures.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -31,7 +31,7 @@
 procedure freeModule;
 
 implementation
-uses GLunit, uUtils, uVariables, uConsts, uDebug;
+uses GLunit, uUtils, uVariables, uConsts, uDebug, uConsole;
 
 var TextureList: PTexture;
 
@@ -207,7 +207,7 @@
 procedure FreeTexture(tex: PTexture);
 begin
     if tex <> nil then
-    begin
+        begin
         if tex^.NextTexture <> nil then
             tex^.NextTexture^.PrevTexture:= tex^.PrevTexture;
         if tex^.PrevTexture <> nil then
@@ -216,7 +216,7 @@
             TextureList:= tex^.NextTexture;
         glDeleteTextures(1, @tex^.id);
         Dispose(tex);
-    end
+        end
 end;
 
 procedure initModule;
@@ -226,7 +226,12 @@
 
 procedure freeModule;
 begin
-    while TextureList <> nil do FreeTexture(TextureList);
+    if TextureList <> nil then WriteToConsole('FIXME FIXME FIXME. App shutdown without full cleanup of texture list; read game0.log and please report this problem');
+    while TextureList <> nil do 
+        begin
+        AddFileLog('Texture not freed: width='+inttostr(LongInt(TextureList^.w))+' height='+inttostr(LongInt(TextureList^.h))+' priority='+inttostr(round(TextureList^.priority*1000)));
+        FreeTexture(TextureList);
+        end
 end;
 
 end.
--- a/hedgewars/uVariables.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uVariables.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -152,7 +152,8 @@
     cLaserSighting  : boolean;
     cVampiric       : boolean;
     cArtillery      : boolean;
-    WeaponTooltipTex : PTexture;
+    WeaponTooltipTex: PTexture;
+    HHTexture       : PTexture;
 
     flagMakeCapture : boolean;
 
--- a/hedgewars/uVisualGears.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uVisualGears.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -401,8 +401,7 @@
 
 procedure DeleteVisualGear(Gear: PVisualGear);
 begin
-    if Gear^.Tex <> nil then
-        FreeTexture(Gear^.Tex);
+    FreeTexture(Gear^.Tex);
     Gear^.Tex:= nil;
 
     if Gear^.NextGear <> nil then Gear^.NextGear^.PrevGear:= Gear^.PrevGear;
--- a/hedgewars/uWorld.pas	Thu Nov 24 13:44:30 2011 +0100
+++ b/hedgewars/uWorld.pas	Thu Nov 24 16:18:45 2011 +0100
@@ -27,6 +27,8 @@
 procedure freeModule;
 
 procedure InitWorld;
+procedure ResetWorldTex;
+
 procedure DrawWorld(Lag: LongInt);
 procedure DrawWorldStereo(Lag: LongInt; RM: TRenderMode);
 procedure ShowMission(caption, subcaption, text: ansistring; icon, time : LongInt);
@@ -212,6 +214,17 @@
 cGearScrEdgesDist:= min(2 * cScreenHeight div 5, 2 * cScreenWidth div 5);
 end;
 
+// for uStore texture resetting
+procedure ResetWorldTex;
+begin
+    FreeTexture(fpsTexture);
+    fpsTexture:= nil;
+    FreeTexture(timeTexture);
+    timeTexture:= nil;
+    FreeTexture(missionTex);
+    missionTex:= nil;
+end;
+
 procedure ShowAmmoMenu;
 const MENUSPEED = 15;
 const BORDERSIZE = 2;
@@ -1091,12 +1104,10 @@
         if t < 10 then s:= '0' + s;
         s:= inttostr(i div 60) + ':' + s;
    
-        if timeTexture <> nil then
-            FreeTexture(timeTexture);
-        timeTexture:= nil;
     
         tmpSurface:= TTF_RenderUTF8_Blended(Fontz[fnt16].Handle, Str2PChar(s), cWhiteColorChannels);
         tmpSurface:= doSurfaceConversion(tmpSurface);
+        FreeTexture(timeTexture);
         timeTexture:= Surface2Tex(tmpSurface, false);
         SDL_FreeSurface(tmpSurface)
     end;
@@ -1112,11 +1123,9 @@
             Frames:= 0;
             CountTicks:= 0;
             s:= inttostr(FPS) + ' fps';
-            if fpsTexture <> nil then
-                FreeTexture(fpsTexture);
-            fpsTexture:= nil;
             tmpSurface:= TTF_RenderUTF8_Blended(Fontz[fnt16].Handle, Str2PChar(s), cWhiteColorChannels);
             tmpSurface:= doSurfaceConversion(tmpSurface);
+            FreeTexture(fpsTexture);
             fpsTexture:= Surface2Tex(tmpSurface, false);
             SDL_FreeSurface(tmpSurface)
         end;
@@ -1320,9 +1329,7 @@
 
 if time = 0 then time:= 5000;
 missionTimer:= time;
-if missionTex <> nil then
-    FreeTexture(missionTex);
-missionTex:= nil;
+FreeTexture(missionTex);
 
 if icon > -1 then
     begin
@@ -1388,8 +1395,11 @@
 begin
     stereoDepth:= stereoDepth; // avoid hint
     FreeTexture(fpsTexture);
+    fpsTexture:= nil;
     FreeTexture(timeTexture);
+    timeTexture:= nil;
     FreeTexture(missionTex);
+    missionTex:= nil
 end;
 
 end.
--- a/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.h	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.h	Thu Nov 24 16:18:45 2011 +0100
@@ -22,21 +22,15 @@
 #import <Foundation/Foundation.h>
 #import "SDL_net.h"
 
-@protocol EngineProtocolDelegate <NSObject>
-
--(void) gameHasEndedWithStats:(NSArray *)stats;
-
-@end
 
 @interface EngineProtocolNetwork : NSObject {
-    id<EngineProtocolDelegate> delegate;
-
+    NSMutableArray *statsArray;
     NSOutputStream *stream;
     TCPsocket csd;
     NSInteger enginePort;
 }
 
-@property (nonatomic,assign) id<EngineProtocolDelegate> delegate;
+@property (nonatomic,assign) NSMutableArray *statsArray;
 @property (nonatomic,retain) NSOutputStream *stream;
 @property (assign) TCPsocket csd;
 @property (assign) NSInteger enginePort;
@@ -44,11 +38,10 @@
 
 -(id)   init;
 
-+(void) spawnThread:(NSString *)onSaveFile withOptions:(NSDictionary *)dictionary;
+-(void) spawnThread:(NSString *)onSaveFile withOptions:(NSDictionary *)dictionary;
 +(NSInteger) activeEnginePort;
 
 -(void) engineProtocol:(id) object;
--(void) gameHasEndedWithStats:(NSArray *)stats;
 
 -(int)  sendToEngine:(NSString *)string;
 -(int)  sendToEngineNoSave:(NSString *)string;
--- a/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/EngineProtocolNetwork.m	Thu Nov 24 16:18:45 2011 +0100
@@ -28,12 +28,11 @@
 static NSInteger activeEnginePort;
 
 @implementation EngineProtocolNetwork
-@synthesize delegate, stream, csd, enginePort;
+@synthesize statsArray, stream, csd, enginePort;
 
 -(id) init {
     if (self = [super init]) {
-        self.delegate = nil;
-
+        self.statsArray = nil;
         self.csd = NULL;
         self.stream = nil;
         self.enginePort = [HWUtils randomPort];
@@ -42,31 +41,22 @@
     return self;
 }
 
--(void) gameHasEndedWithStats:(NSArray *)stats {
-    if (self.delegate != nil && [self.delegate respondsToSelector:@selector(gameHasEndedWithStats:)])
-        [self.delegate gameHasEndedWithStats:stats];
-    else
-        DLog(@"Error! delegate == nil");
-}
-
 -(void) dealloc {
-    self.delegate = nil;
+    releaseAndNil(statsArray);
     releaseAndNil(stream);
     [super dealloc];
 }
 
 #pragma mark -
 #pragma mark Spawner functions
-+(void) spawnThread:(NSString *)onSaveFile withOptions:(NSDictionary *)dictionary {
-    EngineProtocolNetwork *proto = [[EngineProtocolNetwork alloc] init];
-    proto.stream = (onSaveFile) ? [[NSOutputStream alloc] initToFileAtPath:onSaveFile append:YES] : nil;
-    [proto.stream open];
+-(void) spawnThread:(NSString *)onSaveFile withOptions:(NSDictionary *)dictionary {
+    self.stream = (onSaveFile) ? [[NSOutputStream alloc] initToFileAtPath:onSaveFile append:YES] : nil;
+    [self.stream open];
 
     // +detachNewThreadSelector retain/release self automatically
     [NSThread detachNewThreadSelector:@selector(engineProtocol:)
-                             toTarget:proto
+                             toTarget:self
                            withObject:dictionary];
-    [proto release];
 }
 
 +(NSInteger) activeEnginePort {
@@ -232,7 +222,6 @@
 -(void) engineProtocol:(id) object {
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
     NSDictionary *gameConfig = (NSDictionary *)object;
-    NSMutableArray *statsArray = nil;
     TCPsocket sd;
     IPaddress ip;
     int eProto;
@@ -347,10 +336,10 @@
                 }
                 break;
             case 'i':
-                if (statsArray == nil) {
-                    statsArray = [[NSMutableArray alloc] initWithCapacity:10 - 2];
+                if (self.statsArray == nil) {
+                    self.statsArray = [[NSMutableArray alloc] initWithCapacity:10 - 2];
                     NSMutableArray *ranking = [[NSMutableArray alloc] initWithCapacity:4];
-                    [statsArray insertObject:ranking atIndex:0];
+                    [self.statsArray insertObject:ranking atIndex:0];
                     [ranking release];
                 }
                 NSString *tempStr = [NSString stringWithUTF8String:&buffer[2]];
@@ -359,16 +348,16 @@
                 int index = [arg length] + 3;
                 switch (buffer[1]) {
                     case 'r':           // winning team
-                        [statsArray insertObject:[NSString stringWithUTF8String:&buffer[2]] atIndex:1];
+                        [self.statsArray insertObject:[NSString stringWithUTF8String:&buffer[2]] atIndex:1];
                         break;
                     case 'D':           // best shot
-                        [statsArray addObject:[NSString stringWithFormat:@"The best shot award won by %s (with %@ points)", &buffer[index], arg]];
+                        [self.statsArray addObject:[NSString stringWithFormat:@"The best shot award won by %s (with %@ points)", &buffer[index], arg]];
                         break;
                     case 'k':           // best hedgehog
-                        [statsArray addObject:[NSString stringWithFormat:@"The best killer is %s with %@ kills in a turn", &buffer[index], arg]];
+                        [self.statsArray addObject:[NSString stringWithFormat:@"The best killer is %s with %@ kill(s) in a turn", &buffer[index], arg]];
                         break;
                     case 'K':           // number of hogs killed
-                        [statsArray addObject:[NSString stringWithFormat:@"%@ hedgehog(s) were killed during this round", arg]];
+                        [self.statsArray addObject:[NSString stringWithFormat:@"%@ hedgehog(s) were killed during this round", arg]];
                         break;
                     case 'H':           // team health/graph
                         break;
@@ -376,16 +365,16 @@
                         // still WIP in statsPage.cpp
                         break;
                     case 'P':           // teams ranking
-                        [[statsArray objectAtIndex:0] addObject:tempStr];
+                        [[self.statsArray objectAtIndex:0] addObject:tempStr];
                         break;
                     case 's':           // self damage
-                        [statsArray addObject:[NSString stringWithFormat:@"%s thought it's good to shoot his own hedgehogs with %@ points", &buffer[index], arg]];
+                        [self.statsArray addObject:[NSString stringWithFormat:@"%s thought it's good to shoot his own hedgehogs with %@ points", &buffer[index], arg]];
                         break;
                     case 'S':           // friendly fire
-                        [statsArray addObject:[NSString stringWithFormat:@"%s killed %@ of his own hedgehogs", &buffer[index], arg]];
+                        [self.statsArray addObject:[NSString stringWithFormat:@"%s killed %@ of his own hedgehogs", &buffer[index], arg]];
                         break;
                     case 'B':           // turn skipped
-                        [statsArray addObject:[NSString stringWithFormat:@"%s was scared and skipped turn %@ times", &buffer[index], arg]];
+                        [self.statsArray addObject:[NSString stringWithFormat:@"%s was scared and skipped turn %@ times", &buffer[index], arg]];
                         break;
                     default:
                         DLog(@"Unhandled stat message, see statsPage.cpp");
@@ -393,12 +382,14 @@
                 }
                 break;
             case 'q':
-                // game ended, can remove the savefile and present the statistics of the match
+                // game ended and match finished, statsArray is full of delicious statistics
                 [HWUtils setGameStatus:gsEnded];
-                [self gameHasEndedWithStats:statsArray];
+                // closing connection here would trigger a "IPC connection lost" error, so we have to wait until recv fails
                 break;
             case 'Q':
-                // game exited but not completed, nothing to do (just don't save the message)
+                // game exited but not completed, skip this message in the savefile
+                [HWUtils setGameStatus:gsInterrupted];
+                // same here, don't set clientQuit to YES
                 break;
             default:
                 [self dumpRawData:buffer ofSize:msgSize];
@@ -406,9 +397,9 @@
         }
     }
     DLog(@"Engine exited, ending thread");
+
     [self.stream close];
     [self.stream release];
-    [statsArray release];
 
     // Close the client socket
     SDLNet_TCP_Close(csd);
--- a/project_files/HedgewarsMobile/Classes/GameConfigViewController.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/GameConfigViewController.m	Thu Nov 24 16:18:45 2011 +0100
@@ -223,6 +223,7 @@
                                     script,@"mission_command",
                                     nil];
 
+    [GameInterfaceBridge registerCallingController:self];
     [GameInterfaceBridge startLocalGame:gameDictionary];
     [gameDictionary release];
 }
--- a/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.h	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.h	Thu Nov 24 16:18:45 2011 +0100
@@ -21,15 +21,22 @@
 
 #import <Foundation/Foundation.h>
 
+@class EngineProtocolNetwork;
 
 @interface GameInterfaceBridge : NSObject {
     UIView *blackView;
+    NSString *savePath;
+    EngineProtocolNetwork *proto;
 }
 
 @property (nonatomic,retain) UIView *blackView;
+@property (nonatomic,retain) NSString *savePath;
+@property (nonatomic,retain) EngineProtocolNetwork *proto;
 
 +(void) startLocalGame:(NSDictionary *)withOptions;
 +(void) startSaveGame:(NSString *)atPath;
 +(void) startMissionGame:(NSString *)withScript;
 
++(void) registerCallingController:(UIViewController *)controller;
+
 @end
--- a/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/GameInterfaceBridge.m	Thu Nov 24 16:18:45 2011 +0100
@@ -26,16 +26,22 @@
 #import "AudioManagerController.h"
 #import "ObjcExports.h"
 
+static UIViewController *callingController;
+
 @implementation GameInterfaceBridge
-@synthesize blackView;
+@synthesize blackView, savePath, proto;
 
 #pragma mark -
 #pragma mark Instance methods for engine interaction
 // prepares the controllers for hosting a game
--(void) earlyEngineLaunch:(NSString *)pathOrNil withOptions:(NSDictionary *)optionsOrNil {
+-(void) earlyEngineLaunch:(NSDictionary *)optionsOrNil {
     [self retain];
     [AudioManagerController stopBackgroundMusic];
-    [EngineProtocolNetwork spawnThread:pathOrNil withOptions:optionsOrNil];
+
+    EngineProtocolNetwork *engineProtocol = [[EngineProtocolNetwork alloc] init];
+    self.proto = engineProtocol;
+    [engineProtocol release];
+    [self.proto spawnThread:self.savePath withOptions:optionsOrNil];
 
     // add a black view hiding the background
     CGRect theFrame = [[UIScreen mainScreen] bounds];
@@ -53,15 +59,19 @@
 
     // keep track of uncompleted games
     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
-    [userDefaults setObject:pathOrNil forKey:@"savedGamePath"];
+    [userDefaults setObject:self.savePath forKey:@"savedGamePath"];
     [userDefaults synchronize];
 
     // let's launch the engine using this -perfomSelector so that the runloop can deal with queued messages first
-    [self performSelector:@selector(engineLaunch:) withObject:pathOrNil afterDelay:0.1f];
+    [self performSelector:@selector(engineLaunch) withObject:nil afterDelay:0.1f];
 }
 
 // cleans up everything
 -(void) lateEngineLaunch {
+    // notify views below that they are getting the spotlight again
+    [[[HedgewarsAppDelegate sharedAppDelegate] uiwindow] makeKeyAndVisible];
+    [callingController viewWillAppear:YES];
+
     // remove completed games notification
     NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
     [userDefaults setObject:@"" forKey:@"savedGamePath"];
@@ -78,16 +88,36 @@
     // the overlay is not needed any more and can be removed
     [[OverlayViewController mainOverlay] removeOverlay];
 
+    // engine thread *should* be done by now
+    NSArray *stats = [[NSArray alloc] initWithArray:self.proto.statsArray copyItems:YES];
+    if ([HWUtils gameStatus] == gsEnded && stats != nil) {
+        StatsPageViewController *statsPage = [[StatsPageViewController alloc] initWithStyle:UITableViewStyleGrouped];
+        statsPage.statsArray = stats;
+        statsPage.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
+        if ([statsPage respondsToSelector:@selector(setModalPresentationStyle:)])
+            statsPage.modalPresentationStyle = UIModalPresentationPageSheet;
+
+        [callingController presentModalViewController:statsPage animated:YES];
+        [statsPage release];
+    }
+    [stats release];
+
+    // can remove the savefile if the replay has ended
+    if ([HWUtils gameType] == gtSave)
+        [[NSFileManager defaultManager] removeItemAtPath:self.savePath error:nil];
+
     // restart music and we're done
     [AudioManagerController playBackgroundMusic];
+    [HWUtils setGameStatus:gsNone];
+    [HWUtils setGameType:gtNone];
     [self release];
 }
 
 // main routine for calling the actual game engine
--(void) engineLaunch:(NSString *)pathOrNil {
+-(void) engineLaunch {
     const char *gameArgs[11];
     CGFloat width, height;
-    NSInteger enginePort = [EngineProtocolNetwork activeEnginePort];
+    NSInteger enginePort = self.proto.enginePort;
     CGFloat screenScale = [[UIScreen mainScreen] safeScale];
     NSString *ipcString = [[NSString alloc] initWithFormat:@"%d",enginePort];
     NSString *localeString = [[NSString alloc] initWithFormat:@"%@.txt",[[NSLocale currentLocale] objectForKey:NSLocaleLanguageCode]];
@@ -139,7 +169,7 @@
     gameArgs[ 7] = [[[settings objectForKey:@"music"] stringValue] UTF8String];                 //isMusicEnabled
     gameArgs[ 8] = [[[settings objectForKey:@"alternate"] stringValue] UTF8String];             //cAltDamage
     gameArgs[ 9] = [resourcePath UTF8String];                                                   //PathPrefix
-    gameArgs[10] = ([HWUtils gameType] == gtSave) ? [pathOrNil UTF8String] : NULL;              //recordFileName
+    gameArgs[10] = ([HWUtils gameType] == gtSave) ? [self.savePath UTF8String] : NULL;          //recordFileName
 
     [verticalSize release];
     [horizontalSize release];
@@ -154,12 +184,24 @@
     [self lateEngineLaunch];
 }
 
+-(void) dealloc {
+    releaseAndNil(blackView);
+    releaseAndNil(savePath);
+    releaseAndNil(proto);
+    [super dealloc];
+}
+
 #pragma mark -
 #pragma mark Class methods for setting up the engine from outsite
++(void) registerCallingController:(UIViewController *)controller {
+    callingController = controller;
+}
+
 +(void) startGame:(TGameType) type atPath:(NSString *)path withOptions:(NSDictionary *)config {
     [HWUtils setGameType:type];
-    GameInterfaceBridge *bridge = [[GameInterfaceBridge alloc] init];
-    [bridge earlyEngineLaunch:path withOptions:config];
+    id bridge = [[self alloc] init];
+    [bridge setSavePath:path];
+    [bridge earlyEngineLaunch:config];
     [bridge release];
 }
 
@@ -190,27 +232,5 @@
     [missionLine release];
 }
 
-/*
--(void) gameHasEndedWithStats:(NSArray *)stats {
-    // wrap this around a retain/realse to prevent being deallocated too soon
-    [self retain];
-    // display stats page if there is something to display
-    if (stats != nil) {
-        StatsPageViewController *statsPage = [[StatsPageViewController alloc] initWithStyle:UITableViewStyleGrouped];
-        statsPage.statsArray = stats;
-        statsPage.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
-        if ([statsPage respondsToSelector:@selector(setModalPresentationStyle:)])
-            statsPage.modalPresentationStyle = UIModalPresentationPageSheet;
-
-        [self.parentController presentModalViewController:statsPage animated:YES];
-        [statsPage release];
-    }
-
-    // can remove the savefile if the replay has ended
-    if ([HWUtils gameType] == gtSave)
-        [[NSFileManager defaultManager] removeItemAtPath:self.savePath error:nil];
-    [self release];
-}
-*/
 
 @end
--- a/project_files/HedgewarsMobile/Classes/HWUtils.h	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/HWUtils.h	Thu Nov 24 16:18:45 2011 +0100
@@ -22,7 +22,7 @@
 #import <Foundation/Foundation.h>
 
 typedef enum {gtNone, gtLocal, gtSave, gtMission, gtNet} TGameType;
-typedef enum {gsNone, gsLoading, gsInGame, gsEnded} TGameStatus;
+typedef enum {gsNone, gsLoading, gsInGame, gsInterrupted, gsEnded} TGameStatus;
 
 @interface HWUtils : NSObject {
 
@@ -37,9 +37,11 @@
 
 +(NSString *)modelType;
 +(NSArray *)teamColors;
++(void) releaseCache;
+
 +(NSInteger) randomPort;
 +(BOOL) isNetworkReachable;
-+(void) releaseCache;
++(UIView *)mainSDLViewInstance;
 
 @end
 
--- a/project_files/HedgewarsMobile/Classes/HWUtils.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/HWUtils.m	Thu Nov 24 16:18:45 2011 +0100
@@ -26,6 +26,7 @@
 #import <SystemConfiguration/SCNetworkReachability.h>
 #import "hwconsts.h"
 #import "EngineProtocolNetwork.h"
+#import "SDL_uikitwindow.h"
 
 static NSString *cachedModel = nil;
 static NSArray *cachedColors = nil;
@@ -62,7 +63,7 @@
 }
 
 #pragma mark -
-#pragma mark Helper Functions
+#pragma mark Helper Functions with cache
 +(NSString *)modelType {
     if (cachedModel == nil) {
         size_t size;
@@ -94,6 +95,13 @@
     return cachedColors;
 }
 
++(void) releaseCache {
+    [cachedModel release], cachedModel = nil;
+    [cachedColors release], cachedColors = nil;
+}
+
+#pragma mark -
+#pragma mark Helper Functions without cache
 +(NSInteger) randomPort {
     srandom(time(NULL));
     NSInteger res = (random() % 64511) + 1024;
@@ -138,9 +146,15 @@
     return ((isReachable && !needsConnection) || nonWiFi) ? testResult : NO;
 }
 
-+(void) releaseCache {
-    [cachedModel release], cachedModel = nil;
-    [cachedColors release], cachedColors = nil;
++(UIView *)mainSDLViewInstance {
+    SDL_Window *window = HW_getSDLWindow();
+    if (window == NULL) {
+        SDL_SetError("Window does not exist");
+        return nil;
+    }
+    SDL_WindowData *data = (SDL_WindowData *)window->driverdata;
+    SDL_uikitview *view = data != NULL ? data->view : nil;
+    return view;
 }
 
 @end
--- a/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.h	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.h	Thu Nov 24 16:18:45 2011 +0100
@@ -34,7 +34,5 @@
 @property (nonatomic,retain) UIWindow *uiwindow;
 @property (nonatomic,retain) UIWindow *secondWindow;
 
-+(HedgewarsAppDelegate *)sharedAppDelegate;
-
 @end
 
--- a/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/HedgewarsAppDelegate.m	Thu Nov 24 16:18:45 2011 +0100
@@ -36,11 +36,6 @@
 @implementation HedgewarsAppDelegate
 @synthesize mainViewController, uiwindow, secondWindow;
 
-// convenience method
-+(HedgewarsAppDelegate *)sharedAppDelegate {
-    return (HedgewarsAppDelegate *)[[UIApplication sharedApplication] delegate];
-}
-
 #pragma mark -
 #pragma mark AppDelegate methods
 -(id) init {
@@ -93,6 +88,7 @@
     // don't stop music if it is playing
     if ([HWUtils isGameLaunched]) {
         [AudioManagerController releaseCache];
+        HW_memoryWarningCallback();
     }
     MSG_MEMCLEAN();
     // don't clean mainMenuViewController here!!!
--- a/project_files/HedgewarsMobile/Classes/InGameMenuViewController.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/InGameMenuViewController.m	Thu Nov 24 16:18:45 2011 +0100
@@ -23,8 +23,6 @@
 #import "SDL_sysvideo.h"
 #import "SDL_uikitkeyboard.h"
 
-//FIXME: add a proper #import when this is exposed in SDL
-extern UIView *SDL_getUikitView(void *);
 
 #define VIEW_HEIGHT 200
 
@@ -115,7 +113,7 @@
                                              cancelButtonTitle:NSLocalizedString(@"Well, maybe not...", @"")
                                         destructiveButtonTitle:NSLocalizedString(@"Of course!", @"")
                                              otherButtonTitles:nil];
-            [actionSheet showInView:(IS_IPAD() ? self.view : SDL_getUikitView(HW_getSDLWindow()))];
+            [actionSheet showInView:(IS_IPAD() ? self.view : [HWUtils mainSDLViewInstance])];
             [actionSheet release];
 
             break;
--- a/project_files/HedgewarsMobile/Classes/MainMenuViewController.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/MainMenuViewController.m	Thu Nov 24 16:18:45 2011 +0100
@@ -27,7 +27,6 @@
 #import "SavedGamesViewController.h"
 #import "RestoreViewController.h"
 #import "MissionTrainingViewController.h"
-#import "GameInterfaceBridge.h"
 #import "Appirater.h"
 #import "ServerProtocolNetwork.h"
 
@@ -114,7 +113,6 @@
     // prompt for restoring any previous game
     NSString *saveString = [userDefaults objectForKey:@"savedGamePath"];
     if (saveString != nil && [saveString isEqualToString:@""] == NO) {
-        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(launchRestoredGame) name:@"launchRestoredGame" object:nil];
         if (self.restoreViewController == nil) {
             NSString *xibName = [@"RestoreViewController-" stringByAppendingString:(IS_IPAD() ? @"iPad" : @"iPhone")];
             RestoreViewController *restored = [[RestoreViewController alloc] initWithNibName:xibName bundle:nil];
@@ -235,12 +233,6 @@
 }
 
 #pragma mark -
--(void) launchRestoredGame {
-    [[NSNotificationCenter defaultCenter] removeObserver:self];
-    [GameInterfaceBridge startSaveGame:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedGamePath"]];
-}
-
-#pragma mark -
 -(void) viewDidUnload {
     self.gameConfigViewController = nil;
     self.settingsViewController = nil;
--- a/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/MissionTrainingViewController.m	Thu Nov 24 16:18:45 2011 +0100
@@ -74,6 +74,7 @@
         [AudioManagerController playBackSound];
         [[self parentViewController] dismissModalViewControllerAnimated:YES];
     } else {
+        [GameInterfaceBridge registerCallingController:self];
         [GameInterfaceBridge startMissionGame:self.missionName];
     }
 }
--- a/project_files/HedgewarsMobile/Classes/ObjcExports.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/ObjcExports.m	Thu Nov 24 16:18:45 2011 +0100
@@ -23,8 +23,6 @@
 #import "OverlayViewController.h"
 #import "AmmoMenuViewController.h"
 
-//FIXME: add a proper #import when this is exposed in SDL
-extern UIView *SDL_getUikitView(void *);
 
 // cache the grenade time
 static NSInteger grenadeTime;
@@ -55,7 +53,7 @@
     overlay_instance = [[OverlayViewController alloc] initWithNibName:@"OverlayViewController" bundle:nil];
     // in order to get rotation events we have to insert the view inside the first view of the second window
     //TODO: when multihead make sure that overlay is displayed in the touch-enabled window
-    [SDL_getUikitView(HW_getSDLWindow()) addSubview:overlay_instance.view];
+    [[HWUtils mainSDLViewInstance] addSubview:overlay_instance.view];
     grenadeTime = 2;
 
     if ([HWUtils gameType] == gtSave) {
--- a/project_files/HedgewarsMobile/Classes/PascalImports.h	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/PascalImports.h	Thu Nov 24 16:18:45 2011 +0100
@@ -98,6 +98,8 @@
     int  HW_getTurnsForCurrentTeam(void);
     int  HW_getMaxNumberOfHogs(void);
     int  HW_getMaxNumberOfTeams(void);
+
+    void HW_memoryWarningCallback(void);
     
 #ifdef __cplusplus
 }
--- a/project_files/HedgewarsMobile/Classes/RestoreViewController.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/RestoreViewController.m	Thu Nov 24 16:18:45 2011 +0100
@@ -36,7 +36,8 @@
 
     if (theButton.tag != 0) {
         [AudioManagerController playClickSound];
-        [[NSNotificationCenter defaultCenter] postNotificationName:@"launchRestoredGame" object:nil];
+        [GameInterfaceBridge registerCallingController:self.parentViewController];
+        [GameInterfaceBridge startSaveGame:[[NSUserDefaults standardUserDefaults] objectForKey:@"savedGamePath"]];
     } else {
         [AudioManagerController playBackSound];
         [defaults setObject:@"" forKey:@"savedGamePath"];
--- a/project_files/HedgewarsMobile/Classes/SavedGamesViewController.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/SavedGamesViewController.m	Thu Nov 24 16:18:45 2011 +0100
@@ -189,6 +189,7 @@
     self.numberOfItems++;
     [self.tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationNone];
 
+    [GameInterfaceBridge registerCallingController:self];
     [GameInterfaceBridge startSaveGame:currentFilePath];
     [currentFilePath release];
 }
--- a/project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.h	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.h	Thu Nov 24 16:18:45 2011 +0100
@@ -37,6 +37,6 @@
 -(id) init:(NSInteger) onPort withAddress:(NSString *)address;
 -(id) initOnPort:(NSInteger) port;
 -(id) initToAddress:(NSString *)address;
-+(ServerProtocolNetwork *)openServerConnection;
++(id) openServerConnection;
 
 @end
--- a/project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.m	Thu Nov 24 13:44:30 2011 +0100
+++ b/project_files/HedgewarsMobile/Classes/ServerProtocolNetwork.m	Thu Nov 24 16:18:45 2011 +0100
@@ -58,8 +58,8 @@
     [super dealloc];
 }
 
-+(ServerProtocolNetwork *)openServerConnection {
-    ServerProtocolNetwork *connection = [[ServerProtocolNetwork alloc] init];
++(id) openServerConnection {
+    id connection = [[self alloc] init];
     [NSThread detachNewThreadSelector:@selector(serverProtocol)
                              toTarget:connection
                            withObject:nil];
Binary file project_files/HedgewarsMobile/Locale/About.strings has changed
Binary file project_files/HedgewarsMobile/Locale/Localizable.strings has changed
Binary file project_files/HedgewarsMobile/Locale/Scheme.strings has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/Locale/hw-desc.txt	Thu Nov 24 16:18:45 2011 +0100
@@ -0,0 +1,31 @@
+Hedgewars, it's a Blast!
+
+✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭
+✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭
+Hedgewars is available for the Mac Appstore! Search Hedgewars on your Mac and get your FREE copy today!
+✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭
+✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭✭ 
+
+The iOS port has some exclusive features, such as
+* iPad VGA Out: hook an external display and play at full resolution;
+* Retina Display Support: play at a higher resolution the whole game;
+* Multitasking: pause the game at any time;
+* Game Restore: you will be always able to complete your match, no matter what.
+
+Description:
+This is the funniest and most addictive game you'll ever play - hilarious fun that you can enjoy anywhere, anytime. Hedgewars is a turn based strategy game but the real buzz is from watching the devastation caused by those pesky hedgehogs with those fantastic weapons - sneaky little blighters with a bad attitude!
+
+In other words Hedgewars is a turn based strategy, artillery, action and comedy game, featuring the antics of pink hedgehogs with attitude as they battle from the depths of hell to the depths of space.
+
+As commander, it's your job to assemble your crack team of hedgehog soldiers and bring the war to your enemy.
+
+Each player controls a team of several hedgehogs. During the course of the game, players take turns with one of their hedgehogs. They then use whatever tools and weapons are available to attack and kill the opponents' hedgehogs, thereby winning the game. Hedgehogs may move around the terrain in a variety of ways, normally by walking and jumping but also by using particular tools such as the "Rope" or "Parachute", to move to otherwise inaccessible areas. Each turn is time-limited to ensure that players do not hold up the game with excessive thinking or moving. A large variety of tools and weapons are available for players during the game: Grenade, Cluster Bomb, Bazooka, UFO, Shotgun, Desert Eagle, Fire Punch, Baseball Bat, Dynamite, Mine, Rope, Pneumatic pick, Parachute. Most weapons, when used, cause explosions that deform the terrain, removing circular chunks. The landscape is an island floating on a body of water, or a restricted cave with water at the bottom. A hedgehog dies when it enters the water (either by falling off the island, or through a hole in the bottom of it), it is thrown off either side of the arena or when its health is reduced, typically from contact with explosions, to zero (the damage dealt to the attacked hedgehog or hedgehogs after a player's or CPU turn is shown only when all movement on the battlefield has ceased).
+
+* Hilarious and devastating turn based combat for up to 6 players
+* Both local and network multiplayer, with optional AI opponents
+* Battle on an infinite number of randomly generated maps, with over 20 environments
+* Use 48 (and counting) overwhelming weapons! Including the piano strike and explosive robotic cake
+* Play the game your way, with more than 20 different game modifiers, tweak almost every aspect of the match
+* Customize your team, with over 120 costumes, 30 graves, 12 forts, 100s of flags and unique voice packs
+* Huge battles with up to 64 hogs
+
--- a/project_files/HedgewarsMobile/SDL-50560ca58f80.patch	Thu Nov 24 13:44:30 2011 +0100
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,261 +0,0 @@
-diff -r 50560ca58f80 Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj
---- a/Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj	Mon Oct 24 23:18:53 2011 -0400
-+++ b/Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj	Wed Nov 02 09:22:08 2011 +0100
-@@ -1596,9 +1596,12 @@
- 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- 				GCC_C_LANGUAGE_STANDARD = c99;
- 				GCC_DEBUGGING_SYMBOLS = full;
-+				GCC_OPTIMIZATION_LEVEL = 0;
-+				GCC_THUMB_SUPPORT = NO;
-+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
- 				GCC_WARN_UNUSED_VARIABLE = NO;
--				IPHONEOS_DEPLOYMENT_TARGET = 3.1.3;
-+				IPHONEOS_DEPLOYMENT_TARGET = 3.0;
- 				ONLY_ACTIVE_ARCH = NO;
- 				PREBINDING = NO;
- 				SDKROOT = iphoneos;
-@@ -1613,9 +1616,12 @@
- 				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
- 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
- 				GCC_C_LANGUAGE_STANDARD = c99;
-+				GCC_FAST_MATH = YES;
-+				GCC_THUMB_SUPPORT = NO;
-+				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
- 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
- 				GCC_WARN_UNUSED_VARIABLE = NO;
--				IPHONEOS_DEPLOYMENT_TARGET = 3.1.3;
-+				IPHONEOS_DEPLOYMENT_TARGET = 3.0;
- 				PREBINDING = NO;
- 				SDKROOT = iphoneos;
- 				TARGETED_DEVICE_FAMILY = "1,2";
-diff -r 50560ca58f80 include/SDL_config_iphoneos.h
---- a/include/SDL_config_iphoneos.h	Mon Oct 24 23:18:53 2011 -0400
-+++ b/include/SDL_config_iphoneos.h	Wed Nov 02 09:22:08 2011 +0100
-@@ -106,7 +106,7 @@
- /* enable iPhone version of Core Audio driver */
- #define SDL_AUDIO_DRIVER_COREAUDIO 1
- /* Enable the dummy audio driver (src/audio/dummy/\*.c) */
--#define SDL_AUDIO_DRIVER_DUMMY	1
-+#define SDL_AUDIO_DRIVER_DUMMY	0
- 
- /* Enable the stub haptic driver (src/haptic/dummy/\*.c) */
- #define SDL_HAPTIC_DISABLED	1
-@@ -132,16 +132,16 @@
- /* enable OpenGL ES */
- #define SDL_VIDEO_OPENGL_ES	1
- #define SDL_VIDEO_RENDER_OGL_ES	1
--#define SDL_VIDEO_RENDER_OGL_ES2	1
-+#define SDL_VIDEO_RENDER_OGL_ES2	0
- 
- /* Enable system power support */
--#define SDL_POWER_UIKIT 1
-+#define SDL_POWER_UIKIT 0
- 
- /* enable iPhone keyboard support */
- #define SDL_IPHONE_KEYBOARD 1
- 
- /* enable joystick subsystem */
--#define SDL_JOYSTICK_DISABLED 0
-+#define SDL_JOYSTICK_DISABLED 1
- 
- /* Set max recognized G-force from accelerometer
-    See src/joystick/uikit/SDLUIAccelerationDelegate.m for notes on why this is needed
-diff -r 50560ca58f80 src/video/uikit/SDL_uikitopenglview.m
---- a/src/video/uikit/SDL_uikitopenglview.m	Mon Oct 24 23:18:53 2011 -0400
-+++ b/src/video/uikit/SDL_uikitopenglview.m	Wed Nov 02 09:22:08 2011 +0100
-@@ -114,8 +114,8 @@
- 
-         // !!! FIXME: use the screen this is on!
-         /* Use the main screen scale (for retina display support) */
--        if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
--            self.contentScaleFactor = [UIScreen mainScreen].scale;
-+        if ([self respondsToSelector:@selector(contentScaleFactor)])
-+            self.contentScaleFactor = [[UIScreen mainScreen] scale];
- 
-         self.autoresizingMask = 0;  // don't allow autoresize, since we need to do some magic in -(void)updateFrame.
-     }
-@@ -144,8 +144,8 @@
- 
-     // !!! FIXME: use the screen this is on!
-     /* Use the main screen scale (for retina display support) */
--    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
--        self.contentScaleFactor = [UIScreen mainScreen].scale;
-+    if ([self respondsToSelector:@selector(contentScaleFactor)])
-+        self.contentScaleFactor = [[UIScreen mainScreen] scale];
- }
- 
- - (void)setCurrentContext
-diff -r 50560ca58f80 src/video/uikit/SDL_uikitvideo.m
---- a/src/video/uikit/SDL_uikitvideo.m	Mon Oct 24 23:18:53 2011 -0400
-+++ b/src/video/uikit/SDL_uikitvideo.m	Wed Nov 02 09:22:08 2011 +0100
-@@ -178,7 +178,7 @@
- 
-     // UIScreenMode showed up in 3.2 (the iPad and later). We're
-     //  misusing this supports_multiple_displays flag here for that.
--    if (!SDL_UIKit_supports_multiple_displays) {
-+    if (SDL_UIKit_supports_multiple_displays) {
-         UIScreenMode *uimode = [uiscreen currentMode];
-         [uimode retain];  // once for the desktop_mode
-         [uimode retain];  // once for the current_mode
-@@ -200,10 +200,8 @@
- {
-     _this->gl_config.driver_loaded = 1;
- 
--    NSString *reqSysVer = @"3.2";
--    NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
--    if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedAscending)
--        SDL_UIKit_supports_multiple_displays = YES;
-+    // this tells us whether we are running on ios >= 3.2
-+    SDL_UIKit_supports_multiple_displays = [UIScreen instancesRespondToSelector:@selector(currentMode)];
- 
-     // Add the main screen.
-     UIScreen *uiscreen = [UIScreen mainScreen];
-diff -r 50560ca58f80 src/video/uikit/SDL_uikitview.m
---- a/src/video/uikit/SDL_uikitview.m	Mon Oct 24 23:18:53 2011 -0400
-+++ b/src/video/uikit/SDL_uikitview.m	Wed Nov 02 09:22:08 2011 +0100
-@@ -311,7 +311,7 @@
- /* iPhone keyboard addition functions */
- #if SDL_IPHONE_KEYBOARD
- 
--SDL_uikitview * getWindowView(SDL_Window * window)
-+SDL_uikitview *SDL_getUikitView(SDL_Window *window)
- {
-     if (window == NULL) {
-         SDL_SetError("Window does not exist");
-@@ -328,9 +328,9 @@
-     return view;
- }
- 
--int SDL_iPhoneKeyboardShow(SDL_Window * window)
-+int SDL_iPhoneKeyboardShow(SDL_Window *window)
- {
--    SDL_uikitview *view = getWindowView(window);
-+    SDL_uikitview *view = SDL_getUikitView(window);
-     if (view == nil) {
-         return -1;
-     }
-@@ -339,9 +339,9 @@
-     return 0;
- }
- 
--int SDL_iPhoneKeyboardHide(SDL_Window * window)
-+int SDL_iPhoneKeyboardHide(SDL_Window *window)
- {
--    SDL_uikitview *view = getWindowView(window);
-+    SDL_uikitview *view = SDL_getUikitView(window);
-     if (view == nil) {
-         return -1;
-     }
-@@ -350,9 +350,9 @@
-     return 0;
- }
- 
--SDL_bool SDL_iPhoneKeyboardIsShown(SDL_Window * window)
-+SDL_bool SDL_iPhoneKeyboardIsShown(SDL_Window *window)
- {
--    SDL_uikitview *view = getWindowView(window);
-+    SDL_uikitview *view = SDL_getUikitView(window);
-     if (view == nil) {
-         return 0;
-     }
-@@ -360,9 +360,9 @@
-     return view.keyboardVisible;
- }
- 
--int SDL_iPhoneKeyboardToggle(SDL_Window * window)
-+int SDL_iPhoneKeyboardToggle(SDL_Window *window)
- {
--    SDL_uikitview *view = getWindowView(window);
-+    SDL_uikitview *view = SDL_getUikitView(window);
-     if (view == nil) {
-         return -1;
-     }
-@@ -380,24 +380,24 @@
- 
- /* stubs, used if compiled without keyboard support */
- 
--int SDL_iPhoneKeyboardShow(SDL_Window * window)
-+int SDL_iPhoneKeyboardShow(SDL_Window *window)
- {
-     SDL_SetError("Not compiled with keyboard support");
-     return -1;
- }
- 
--int SDL_iPhoneKeyboardHide(SDL_Window * window)
-+int SDL_iPhoneKeyboardHide(SDL_Window *window)
- {
-     SDL_SetError("Not compiled with keyboard support");
-     return -1;
- }
- 
--SDL_bool SDL_iPhoneKeyboardIsShown(SDL_Window * window)
-+SDL_bool SDL_iPhoneKeyboardIsShown(SDL_Window *window)
- {
-     return 0;
- }
- 
--int SDL_iPhoneKeyboardToggle(SDL_Window * window)
-+int SDL_iPhoneKeyboardToggle(SDL_Window *window)
- {
-     SDL_SetError("Not compiled with keyboard support");
-     return -1;
-diff -r 50560ca58f80 src/video/uikit/SDL_uikitviewcontroller.m
---- a/src/video/uikit/SDL_uikitviewcontroller.m	Mon Oct 24 23:18:53 2011 -0400
-+++ b/src/video/uikit/SDL_uikitviewcontroller.m	Wed Nov 02 09:22:08 2011 +0100
-@@ -28,8 +28,8 @@
- 
- #include "SDL_uikitwindow.h"
- 
--#import "SDL_uikitviewcontroller.h"
--
-+#include "SDL_uikitviewcontroller.h"
-+#include "SDL_uikitvideo.h"
- 
- @implementation SDL_uikitviewcontroller
- 
-@@ -116,38 +116,17 @@
-     const UIInterfaceOrientation toInterfaceOrientation = [self interfaceOrientation];
-     SDL_WindowData *data = self->window->driverdata;
-     UIWindow *uiwindow = data->uiwindow;
--    UIScreen *uiscreen = [uiwindow screen];
-+    UIScreen *uiscreen;
-+    if (SDL_UIKit_supports_multiple_displays)
-+        uiscreen = [uiwindow screen];
-+    else
-+        uiscreen = [UIScreen mainScreen];
-     const int noborder = self->window->flags & SDL_WINDOW_BORDERLESS;
-     CGRect frame = noborder ? [uiscreen bounds] : [uiscreen applicationFrame];
--    const CGSize size = frame.size;
--    int w, h;
--
--    switch (toInterfaceOrientation) {
--        case UIInterfaceOrientationPortrait:
--        case UIInterfaceOrientationPortraitUpsideDown:
--            w = (size.width < size.height) ? size.width : size.height;
--            h = (size.width > size.height) ? size.width : size.height;
--            break;
--
--        case UIInterfaceOrientationLandscapeLeft:
--        case UIInterfaceOrientationLandscapeRight:
--            w = (size.width > size.height) ? size.width : size.height;
--            h = (size.width < size.height) ? size.width : size.height;
--            break;
--
--        default:
--            SDL_assert(0 && "Unexpected interface orientation!");
--            return;
--    }
--
--    frame.size.width = w;
--    frame.size.height = h;
--    frame.origin.x = 0;
--    frame.origin.y = 0;
- 
-     [uiwindow setFrame:frame];
-     [data->view updateFrame];
--    SDL_SendWindowEvent(self->window, SDL_WINDOWEVENT_RESIZED, w, h);
-+    SDL_SendWindowEvent(self->window, SDL_WINDOWEVENT_RESIZED, frame.size.width, frame.size.height);
- }
- 
- @end
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/project_files/HedgewarsMobile/SDL-687400b595ab.patch	Thu Nov 24 16:18:45 2011 +0100
@@ -0,0 +1,198 @@
+diff -r 687400b595ab Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj
+--- a/Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj	Sat Nov 19 19:23:33 2011 -0500
++++ b/Xcode-iPhoneOS/SDL/SDLiPhoneOS.xcodeproj/project.pbxproj	Sun Nov 20 18:57:07 2011 +0100
+@@ -1596,9 +1596,12 @@
+ 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ 				GCC_C_LANGUAGE_STANDARD = c99;
+ 				GCC_DEBUGGING_SYMBOLS = full;
++				GCC_OPTIMIZATION_LEVEL = 0;
++				GCC_THUMB_SUPPORT = NO;
++				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ 				GCC_WARN_UNUSED_VARIABLE = NO;
+-				IPHONEOS_DEPLOYMENT_TARGET = 3.1.3;
++				IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+ 				ONLY_ACTIVE_ARCH = NO;
+ 				PREBINDING = NO;
+ 				SDKROOT = iphoneos;
+@@ -1613,9 +1616,12 @@
+ 				ARCHS = "$(ARCHS_STANDARD_32_BIT)";
+ 				"CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
+ 				GCC_C_LANGUAGE_STANDARD = c99;
++				GCC_FAST_MATH = YES;
++				GCC_THUMB_SUPPORT = NO;
++				GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+ 				GCC_WARN_ABOUT_RETURN_TYPE = YES;
+ 				GCC_WARN_UNUSED_VARIABLE = NO;
+-				IPHONEOS_DEPLOYMENT_TARGET = 3.1.3;
++				IPHONEOS_DEPLOYMENT_TARGET = 3.0;
+ 				PREBINDING = NO;
+ 				SDKROOT = iphoneos;
+ 				TARGETED_DEVICE_FAMILY = "1,2";
+@@ -1630,6 +1636,7 @@
+ 				DEPLOYMENT_LOCATION = NO;
+ 				GCC_DYNAMIC_NO_PIC = NO;
+ 				GCC_OPTIMIZATION_LEVEL = 0;
++				GCC_PREPROCESSOR_DEFINITIONS = SDL_NO_COMPAT;
+ 				PREBINDING = NO;
+ 				PRODUCT_NAME = SDL;
+ 				SKIP_INSTALL = YES;
+@@ -1644,6 +1651,7 @@
+ 				DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ 				DEPLOYMENT_LOCATION = NO;
+ 				GCC_ENABLE_FIX_AND_CONTINUE = NO;
++				GCC_PREPROCESSOR_DEFINITIONS = SDL_NO_COMPAT;
+ 				PREBINDING = NO;
+ 				PRODUCT_NAME = SDL;
+ 				SKIP_INSTALL = YES;
+diff -r 687400b595ab include/SDL_compat.h
+--- a/include/SDL_compat.h	Sat Nov 19 19:23:33 2011 -0500
++++ b/include/SDL_compat.h	Sun Nov 20 18:57:07 2011 +0100
+@@ -40,7 +40,7 @@
+ 
+  /*@}*/
+ 
+-#ifdef SDL_NO_COMPAT
++#ifndef SDL_NO_COMPAT
+ #define _SDL_compat_h
+ #endif
+ 
+diff -r 687400b595ab include/SDL_config_iphoneos.h
+--- a/include/SDL_config_iphoneos.h	Sat Nov 19 19:23:33 2011 -0500
++++ b/include/SDL_config_iphoneos.h	Sun Nov 20 18:57:07 2011 +0100
+@@ -106,7 +106,7 @@
+ /* enable iPhone version of Core Audio driver */
+ #define SDL_AUDIO_DRIVER_COREAUDIO 1
+ /* Enable the dummy audio driver (src/audio/dummy/\*.c) */
+-#define SDL_AUDIO_DRIVER_DUMMY	1
++#define SDL_AUDIO_DRIVER_DUMMY	0
+ 
+ /* Enable the stub haptic driver (src/haptic/dummy/\*.c) */
+ #define SDL_HAPTIC_DISABLED	1
+@@ -132,16 +132,16 @@
+ /* enable OpenGL ES */
+ #define SDL_VIDEO_OPENGL_ES	1
+ #define SDL_VIDEO_RENDER_OGL_ES	1
+-#define SDL_VIDEO_RENDER_OGL_ES2	1
++#define SDL_VIDEO_RENDER_OGL_ES2	0
+ 
+ /* Enable system power support */
+-#define SDL_POWER_UIKIT 1
++#define SDL_POWER_UIKIT 0
+ 
+ /* enable iPhone keyboard support */
+ #define SDL_IPHONE_KEYBOARD 1
+ 
+ /* enable joystick subsystem */
+-#define SDL_JOYSTICK_DISABLED 0
++#define SDL_JOYSTICK_DISABLED 1
+ 
+ /* Set max recognized G-force from accelerometer
+    See src/joystick/uikit/SDLUIAccelerationDelegate.m for notes on why this is needed
+diff -r 687400b595ab include/SDL_events.h
+--- a/include/SDL_events.h	Sat Nov 19 19:23:33 2011 -0500
++++ b/include/SDL_events.h	Sun Nov 20 18:57:07 2011 +0100
+@@ -107,11 +107,12 @@
+ 
+     SDL_CLIPBOARDUPDATE = 0x900, /**< The clipboard changed */
+ 
++#ifndef SDL_NO_COMPAT
+     /* Obsolete events */
+     SDL_EVENT_COMPAT1 = 0x7000, /**< SDL 1.2 events for compatibility */
+     SDL_EVENT_COMPAT2,
+     SDL_EVENT_COMPAT3,
+-
++#endif
+ 
+     /** Events ::SDL_USEREVENT through ::SDL_LASTEVENT are for your use,
+      *  and should be allocated with SDL_RegisterEvents()
+diff -r 687400b595ab src/SDL_compat.c
+--- a/src/SDL_compat.c	Sat Nov 19 19:23:33 2011 -0500
++++ b/src/SDL_compat.c	Sun Nov 20 18:57:07 2011 +0100
+@@ -29,6 +29,7 @@
+ #include "video/SDL_pixels_c.h"
+ #include "render/SDL_yuv_sw_c.h"
+ 
++#ifndef SDL_NO_COMPAT
+ 
+ static SDL_Window *SDL_VideoWindow = NULL;
+ static SDL_Surface *SDL_WindowSurface = NULL;
+@@ -1813,4 +1814,5 @@
+     return 0;
+ }
+ 
++#endif /* SDL_NO_COMPAT */
+ /* vi: set ts=4 sw=4 expandtab: */
+diff -r 687400b595ab src/video/SDL_surface.c
+--- a/src/video/SDL_surface.c	Sat Nov 19 19:23:33 2011 -0500
++++ b/src/video/SDL_surface.c	Sun Nov 20 18:57:07 2011 +0100
+@@ -195,12 +195,14 @@
+         SDL_InvalidateMap(surface->map);
+     }
+ 
++#ifndef SDL_NO_COMPAT
+     /* Compatibility mode */
+     if (surface->map->info.flags & SDL_COPY_COLORKEY) {
+         surface->flags |= SDL_SRCCOLORKEY;
+     } else {
+         surface->flags &= ~SDL_SRCCOLORKEY;
+     }
++#endif
+ 
+     return 0;
+ }
+@@ -405,12 +407,14 @@
+         SDL_InvalidateMap(surface->map);
+     }
+ 
++#ifndef SDL_NO_COMPAT
+     /* Compatibility mode */
+     if (surface->map->info.flags & SDL_COPY_BLEND) {
+         surface->flags |= SDL_SRCALPHA;
+     } else {
+         surface->flags &= ~SDL_SRCALPHA;
+     }
++#endif
+ 
+     return status;
+ }
+diff -r 687400b595ab src/video/uikit/SDL_uikitopenglview.m
+--- a/src/video/uikit/SDL_uikitopenglview.m	Sat Nov 19 19:23:33 2011 -0500
++++ b/src/video/uikit/SDL_uikitopenglview.m	Sun Nov 20 18:57:07 2011 +0100
+@@ -80,7 +80,7 @@
+ 
+         // !!! FIXME: use the screen this is on!
+         /* Use the main screen scale (for retina display support) */
+-        if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
++        if ([self respondsToSelector:@selector(contentScaleFactor)])
+             self.contentScaleFactor = [UIScreen mainScreen].scale;
+ 
+         /* create the buffers */
+diff -r 687400b595ab src/video/uikit/SDL_uikitviewcontroller.m
+--- a/src/video/uikit/SDL_uikitviewcontroller.m	Sat Nov 19 19:23:33 2011 -0500
++++ b/src/video/uikit/SDL_uikitviewcontroller.m	Sun Nov 20 18:57:07 2011 +0100
+@@ -29,9 +29,8 @@
+ #include "../../events/SDL_events_c.h"
+ 
+ #include "SDL_uikitwindow.h"
+-
+-#import "SDL_uikitviewcontroller.h"
+-
++#include "SDL_uikitviewcontroller.h"
++#include "SDL_uikitvideo.h"
+ 
+ @implementation SDL_uikitviewcontroller
+ 
+@@ -114,7 +113,11 @@
+     const UIInterfaceOrientation toInterfaceOrientation = [self interfaceOrientation];
+     SDL_WindowData *data = self->window->driverdata;
+     UIWindow *uiwindow = data->uiwindow;
+-    UIScreen *uiscreen = [uiwindow screen];
++    UIScreen *uiscreen;
++    if (SDL_UIKit_supports_multiple_displays)
++        uiscreen = [uiwindow screen];
++    else
++        uiscreen = [UIScreen mainScreen];
+     const int noborder = (self->window->flags & (SDL_WINDOW_FULLSCREEN|SDL_WINDOW_BORDERLESS));
+     CGRect frame = noborder ? [uiscreen bounds] : [uiscreen applicationFrame];
+     const CGSize size = frame.size;
--- a/share/hedgewars/Data/Locale/hedgewars_pl.ts	Thu Nov 24 13:44:30 2011 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_pl.ts	Thu Nov 24 16:18:45 2011 +0100
@@ -70,7 +70,7 @@
     </message>
     <message>
         <source>Game Options</source>
-        <translation type="unfinished">Opcje</translation>
+        <translation>Opcje</translation>
     </message>
 </context>
 <context>
@@ -93,51 +93,51 @@
     </message>
     <message>
         <source>%1 has been removed from your ignore list</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 został usunięty z listy ignorowanych</translation>
     </message>
     <message>
         <source>%1 has been added to your ignore list</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 został dodany do listy ignorowanych</translation>
     </message>
     <message>
         <source>%1 has been removed from your friends list</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 został usunięty z listy przyjaciół</translation>
     </message>
     <message>
         <source>%1 has been added to your friends list</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 został dodany do listy przyjaciół</translation>
     </message>
     <message>
         <source>Stylesheet imported from %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Arkusz stylów został zaimportowany z %1</translation>
     </message>
     <message>
         <source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
-        <translation type="unfinished"></translation>
+        <translation>Wpisz %1 jeśli chcesz użyć tego arkusza stylów w przyszłości. Wpisz %2 by go zresetować!</translation>
     </message>
     <message>
         <source>Couldn&apos;t read %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Nie można odczytać %1</translation>
     </message>
     <message>
         <source>StyleSheet discarded</source>
-        <translation type="unfinished"></translation>
+        <translation>Arkusz stylów został odrzucony</translation>
     </message>
     <message>
         <source>StyleSheet saved to %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Arkusz stylów został zapisany jako %1</translation>
     </message>
     <message>
         <source>Failed to save StyleSheet to %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Nie można było zapisać arkusza stylów jako %1</translation>
     </message>
     <message>
         <source>%1 is not a valid command!</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 nie jest poprawnym poleceniem!</translation>
     </message>
     <message>
         <source>Kicking %1 ...</source>
-        <translation type="unfinished"></translation>
+        <translation>Wyrzucam %1...</translation>
     </message>
 </context>
 <context>
@@ -190,43 +190,43 @@
     </message>
     <message>
         <source>Game aborted</source>
-        <translation type="unfinished"></translation>
+        <translation>Gra przerwana</translation>
     </message>
     <message>
         <source>Password</source>
-        <translation type="unfinished">Hasło</translation>
+        <translation>Hasło</translation>
     </message>
     <message>
         <source>Your nickname %1 is
 registered on Hedgewars.org
 Please provide your password below
 or pick another nickname in game config:</source>
-        <translation type="unfinished">Twój nick %1 jest zarejestrowany
+        <translation>Twój nick %1 jest zarejestrowany
 na Hedgewars.org
 Proszę podać hasło bądź zmienić nick
 w ustawieniach gry:</translation>
     </message>
     <message>
         <source>No password supplied.</source>
-        <translation type="unfinished"></translation>
+        <translation>Nie podano hasła.</translation>
     </message>
     <message>
         <source>Nickname</source>
-        <translation type="unfinished">Nick</translation>
+        <translation>Nick</translation>
     </message>
     <message>
         <source>Some one already uses
  your nickname %1
 on the server.
 Please pick another nickname:</source>
-        <translation type="unfinished">Ktoś właśnie używa
+        <translation>Ktoś właśnie używa
 tego nicku %1
 na serwerze.
-Przoszę wybrać nowy nick:</translation>
+Proszę wybrać nowy nick:</translation>
     </message>
     <message>
         <source>No nickname supplied.</source>
-        <translation type="unfinished"></translation>
+        <translation>Nie podano nicku.</translation>
     </message>
 </context>
 <context>
@@ -412,7 +412,7 @@
     </message>
     <message>
         <source>User quit</source>
-        <translation type="unfinished"></translation>
+        <translation>Użytkownik wyszedł</translation>
     </message>
 </context>
 <context>
@@ -617,7 +617,7 @@
     <name>PageInGame</name>
     <message>
         <source>In game...</source>
-        <translation type="unfinished"></translation>
+        <translation>W trakcie gry...</translation>
     </message>
 </context>
 <context>
@@ -763,7 +763,7 @@
     <message>
         <source>Hedgewars is Open Source and Freeware we create in our spare time. If someone sold you the game, you should try get a refund!</source>
         <comment>Tips</comment>
-        <translation>Hedgewars jest darmową grą o otwartym kodzie źródłowym którą tworzymy w naszym wolnym czasie. Jeśli ktokolwiek sprzedał Tobie tę grę pownieneś upomnieć się o swoje pieniądze!</translation>
+        <translation>Hedgewars jest darmową grą o otwartym kodzie źródłowym którą tworzymy w naszym wolnym czasie. Jeśli ktokolwiek sprzedał Tobie tę grę powinieneś upomnieć się o swoje pieniądze!</translation>
     </message>
     <message>
         <source>Connect one or more gamepads before starting the game to be able to assign their controls to your teams.</source>
@@ -803,7 +803,7 @@
     <message>
         <source>The Old Limbuger only causes a small explosion. However the wind affected smelly cloud can poison lots of hogs at once.</source>
         <comment>Tips</comment>
-        <translation>Cuchnący ser nie powoduje wielkiego wybuchu. Jednakże pod wpływem wiatu chmura śmierdzącego gazu może bardzo daleko zawędrować i otruć wiele jeży naraz.</translation>
+        <translation>Cuchnący ser nie powoduje wielkiego wybuchu. Jednakże pod wpływem wiatru chmura śmierdzącego gazu może bardzo daleko zawędrować i otruć wiele jeży naraz.</translation>
     </message>
     <message>
         <source>The Piano Strike is the most damaging air strike. You&apos;ll lose the hedgehog performing it, so there&apos;s a huge downside as well.</source>
@@ -917,7 +917,7 @@
     </message>
     <message>
         <source>Downloadable Content</source>
-        <translation>Dodatki do pobrania</translation>
+        <translation>Dodatki</translation>
     </message>
 </context>
 <context>
@@ -1110,7 +1110,7 @@
     </message>
     <message>
         <source>The Game Scheme defines general options and preferences like Round Time, Sudden Death or Vampirism.</source>
-        <translation>Schemat określa ustawnienia i preferencje takie jak Czas trwania tury, Nagłą śmierć, Wampiryzm itp.</translation>
+        <translation>Schemat określa ustawienia i preferencje takie jak Czas trwania tury, Nagłą śmierć, Wampiryzm itp.</translation>
     </message>
     <message>
         <source>The Weapon Scheme defines available weapons and their ammunition count.</source>
@@ -1361,22 +1361,22 @@
     </message>
     <message>
         <source>Campaign Mode (...)</source>
-        <translation type="unfinished"></translation>
+        <translation>Kampania (...)</translation>
     </message>
     <message>
         <source>Training Mode (Practice your skills in a range of training missions)</source>
-        <translation type="unfinished"></translation>
+        <translation>Trening (sprawdź swoje umiejętności podczas misji treningowych)</translation>
     </message>
 </context>
 <context>
     <name>PageTraining</name>
     <message>
         <source>No description available</source>
-        <translation type="unfinished"></translation>
+        <translation>Brak opisu</translation>
     </message>
     <message>
         <source>Select a mission!</source>
-        <translation type="unfinished"></translation>
+        <translation>Wybierz misjÄ™!</translation>
     </message>
 </context>
 <context>
@@ -1395,7 +1395,7 @@
     </message>
     <message>
         <source>Restrict Team Additions</source>
-        <translation>Zabroń dodawania drużyn</translation>
+        <translation>Zablokuj drużyny</translation>
     </message>
     <message>
         <source>Info</source>
@@ -1903,7 +1903,7 @@
     </message>
     <message>
         <source>This program is distributed under the GNU General Public License v2</source>
-        <translation type="unfinished"></translation>
+        <translation>Ten program jest rozprowadzany na zasadach GNU GPL v2</translation>
     </message>
 </context>
 <context>
--- a/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts	Thu Nov 24 13:44:30 2011 +0100
+++ b/share/hedgewars/Data/Locale/hedgewars_pt_PT.ts	Thu Nov 24 16:18:45 2011 +0100
@@ -65,7 +65,7 @@
     </message>
     <message>
         <source>Game Options</source>
-        <translation type="unfinished">Opções de Jogo</translation>
+        <translation>Opções de Jogo</translation>
     </message>
 </context>
 <context>
@@ -88,51 +88,51 @@
     </message>
     <message>
         <source>%1 has been removed from your ignore list</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 foi removido da tua lista de utilizadores ignorados</translation>
     </message>
     <message>
         <source>%1 has been added to your ignore list</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 foi adicionado à tua lista de utilizadores ignorados</translation>
     </message>
     <message>
         <source>%1 has been removed from your friends list</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 foi removido da tua lista de amigos</translation>
     </message>
     <message>
         <source>%1 has been added to your friends list</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 foi adicionado à tua lista de amigos</translation>
     </message>
     <message>
         <source>Stylesheet imported from %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Stylesheet importado de %1</translation>
     </message>
     <message>
         <source>Enter %1 if you want to use the current StyleSheet in future, enter %2 to reset!</source>
-        <translation type="unfinished"></translation>
+        <translation>Introduz %1 se quiseres utilizar o StyleSheet corrente no futuro, introduz %2 para limpar!</translation>
     </message>
     <message>
         <source>Couldn&apos;t read %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Não foi possivel carregar %1</translation>
     </message>
     <message>
         <source>StyleSheet discarded</source>
-        <translation type="unfinished"></translation>
+        <translation>StyleSheet eliminado</translation>
     </message>
     <message>
         <source>StyleSheet saved to %1</source>
-        <translation type="unfinished"></translation>
+        <translation>StyleSheet gravado em %1</translation>
     </message>
     <message>
         <source>Failed to save StyleSheet to %1</source>
-        <translation type="unfinished"></translation>
+        <translation>Não foi possível gravar o StyleSheet em %1</translation>
     </message>
     <message>
         <source>%1 is not a valid command!</source>
-        <translation type="unfinished"></translation>
+        <translation>%1 não é um comando valido!</translation>
     </message>
     <message>
         <source>Kicking %1 ...</source>
-        <translation type="unfinished"></translation>
+        <translation>A expulsar %1 ...</translation>
     </message>
 </context>
 <context>
@@ -185,42 +185,42 @@
     </message>
     <message>
         <source>Game aborted</source>
-        <translation type="unfinished"></translation>
+        <translation>Jogo abortado</translation>
     </message>
     <message>
         <source>Password</source>
-        <translation type="unfinished">Password</translation>
+        <translation>Password</translation>
     </message>
     <message>
         <source>Your nickname %1 is
 registered on Hedgewars.org
 Please provide your password below
 or pick another nickname in game config:</source>
-        <translation type="unfinished">O nome de utilizador %1 está
+        <translation>O nome de utilizador %1 está
 registado em Hedgewars.org
-Por favor digite a sua palavra passe ou escolha
+Por favor digita a tua palavra passe ou escolhe
 outro nome de utilizador no menu de configuração:</translation>
     </message>
     <message>
         <source>No password supplied.</source>
-        <translation type="unfinished"></translation>
+        <translation>Não foi fornecida uma palavra passe.</translation>
     </message>
     <message>
         <source>Nickname</source>
-        <translation type="unfinished">Nome de utilizador</translation>
+        <translation>Nome de utilizador</translation>
     </message>
     <message>
         <source>Some one already uses
  your nickname %1
 on the server.
 Please pick another nickname:</source>
-        <translation type="unfinished">O nome de utilizador %1
-já está a ser utilizado no servidor.
-Por favor escolha outro nome de utilizador.</translation>
+        <translation>O nome de utilizador %1
+já está a ser utilizado.
+Por favor escolhe outro nome de utilizador.</translation>
     </message>
     <message>
         <source>No nickname supplied.</source>
-        <translation type="unfinished"></translation>
+        <translation>Não foi fornecido um nome de utilizador.</translation>
     </message>
 </context>
 <context>
@@ -401,7 +401,7 @@
     </message>
     <message>
         <source>User quit</source>
-        <translation type="unfinished"></translation>
+        <translation>Utilizador saiu</translation>
     </message>
 </context>
 <context>
@@ -594,7 +594,7 @@
     <name>PageInGame</name>
     <message>
         <source>In game...</source>
-        <translation type="unfinished"></translation>
+        <translation>Em jogo...</translation>
     </message>
 </context>
 <context>
@@ -854,8 +854,7 @@
     </message>
     <message>
         <source>Downloadable Content</source>
-        <translation>Conteúdo Transferível
-Downloadable Content</translation>
+        <translation>Conteúdo Transferível (DLC)</translation>
     </message>
 </context>
 <context>
@@ -1292,22 +1291,22 @@
     </message>
     <message>
         <source>Campaign Mode (...)</source>
-        <translation type="unfinished"></translation>
+        <translation>Modo Campanha (...)</translation>
     </message>
     <message>
         <source>Training Mode (Practice your skills in a range of training missions)</source>
-        <translation type="unfinished"></translation>
+        <translation>Modo Treino (Treina as tuas habilidades numa panóplia de missões de treino)</translation>
     </message>
 </context>
 <context>
     <name>PageTraining</name>
     <message>
         <source>No description available</source>
-        <translation type="unfinished"></translation>
+        <translation>Sem descrição disponível</translation>
     </message>
     <message>
         <source>Select a mission!</source>
-        <translation type="unfinished"></translation>
+        <translation>Selecciona uma missão!</translation>
     </message>
 </context>
 <context>
@@ -1782,7 +1781,7 @@
     </message>
     <message>
         <source>This program is distributed under the GNU General Public License v2</source>
-        <translation type="unfinished"></translation>
+        <translation>Esta aplicação é distribuída sob a GNU General Public License v2</translation>
     </message>
 </context>
 <context>
--- a/share/hedgewars/Data/Locale/it.lua	Thu Nov 24 13:44:30 2011 +0100
+++ b/share/hedgewars/Data/Locale/it.lua	Thu Nov 24 16:18:45 2011 +0100
@@ -1,38 +1,38 @@
 locale = {
---      ["..."] = "",
+    ["..."] = "...",
 	[":("] = ":(",
 	["!!!"] = "!!!",
---      ["Accuracy Bonus!"] = "Bonus accuratezza",
---      ["Achievement Unlocked"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
---      ["a Hedgewars mini-game"] = "Mini gioco Hedgewars", -- Space_Invasion, The_Specialists
+    ["Accuracy Bonus!"] = "Bonus Precisione!",
+    ["Achievement Unlocked"] = "Archivio Sbloccato", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_That_Sinking_Feeling, Tumbler
+    ["a Hedgewars mini-game"] = "un mini-gioco di Hedgewars", -- Space_Invasion, The_Specialists
 	["Aiming Practice"] = "Pratica la tua mira", --Bazooka, Shotgun, SniperRifle
---      ["Ammo"] = "Munizioni",
---      ["Ammo Depleted!"] = "Munizioni scarse!",
---      ["ammo extended!"] = "",
---      ["Ammo is reset at the end of your turn."] = "",
---      ["Ammo Maniac!"] = "Maniaco delle munizioni!",
---      ["Available points remaining: "] = "Punti disponibili rimasti: ",
---      ["[Backspace]"] = "[Cancella]",
---      ["Bamboo Thicket"] = "",
---      ["Barrel Eater!"] = "",
---      ["Barrel Launcher"] = "",
+    ["Ammo"] = "Munizioni",
+    ["Ammo Depleted!"] = "Munizioni scarse!",
+    ["ammo extended!"] = "Munizioni aggiuntive!",
+    ["Ammo is reset at the end of your turn."] = "Le munizioni si azzeranno alla fine del tuo turno",
+    ["Ammo Maniac!"] = "Maniaco delle munizioni!",
+    ["Available points remaining: "] = "Punti disponibili rimasti: ",
+    ["[Backspace]"] = "[Cancella]",
+    ["Bamboo Thicket"] = "Bosco di Bamboo",
+    ["Barrel Eater!"] = "Mangiatore di Barrili!",
+    ["Barrel Launcher"] = "Lanciatore di Barrili",
 	["Bat balls at your enemies and|push them into the sea!"] = "Lancia delle palle ai tuoi nemici|e spingili in acqua!",
 	["Bat your opponents through the|baskets and out of the map!"] = "Manda (colpendoli) i tuoi nemici|in acqua attraverso i canestri laterali!",
 	["Bazooka Training"] = "Addestramento con il Bazooka",
 	["Best laps per team: "] = "Tempo migliore per squadra: ",
---      ["Best Team Times: "] = "Tempi della squadra migliore: ",
+    ["Best Team Times: "] = "Tempi della squadra migliore: ",
 	["Bloody Rookies"] = "Reclute Sanguinose", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree
---      ["BOOM!"] = "BOOM!",
---      ["Boom!"] = "Boom!",
---      ["Boss defeated!"] = "",
---      ["Boss Slayer!"] = "",
---      ["Build a track and race."] = "",
+    ["BOOM!"] = "BOOM!",
+    ["Boom!"] = "Boom!",
+    ["Boss defeated!"] = "Boss sconfitto!",
+    ["Boss Slayer!"] = "Boss Slayer!",
+    ["Build a track and race."] = "Costruisci una pista e corri.",
 	["CAPTURE THE FLAG"] = "Cattura la Bandiera",
---      ["Careless"] = "",
---      ["Change Weapon"] = "",
---      ["Clumsy"] = "",
+    ["Careless"] = "Incauto",
+    ["Change Weapon"] = "Cambia Arma",
+    ["Clumsy"] = "Goffo",
 	["Codename: Teamwork"] = "Nome in codice: Lavoro di Squadra",
---      ["Complete the track as fast as you can!"] = "",
+    ["Complete the track as fast as you can!"] = "Completa la pista più veloce che puoi!",
 	["Congratulations!"] = "Complimenti!",
 	["Congratulations! You've eliminated all targets|within the allowed time frame."] = "Complimenti! Hai distrutto tutti gli obiettivi|entro il tempo previsto.", --Bazooka, Shotgun, SniperRifle
 	["Control pillars to score points."] = "Controlla i pilastri per guadagnare punti.",
@@ -40,183 +40,183 @@
 	["DAMMIT, ROOKIE! GET OFF MY HEAD!"] = "MALEDIZIONE, RECLUTA! VIA DALLA MIA TESTA!",
 	["DAMMIT, ROOKIE!"] = "MALEDIZIONE, RECLUTA!",
 	["Dangerous Ducklings"] = "Papere Pericolose",
---      ["Deadweight"] = "",
---      ["Demolition is fun!"] = "",
---      ["Depleted Kamikaze!"] = "",
---      ["Destroy invaders to score points."] = "",
---      ["Double Kill!"] = "",
---      ["Drone Hunter!"] = "",
---      ["Drowner"] = "",
---      ["Each turn you get 1-3 random weapons"] = "",
---      ["Each turn you get one random weapon"] = "",
+    ["Deadweight"] = "Peso morto",
+    ["Demolition is fun!"] = "Demolire è divertente!",
+    ["Depleted Kamikaze!"] = "Kamikaze Esaurito!",
+    ["Destroy invaders to score points."] = "Distruggi gli invasori per guadagnare dei punti.",
+    ["Double Kill!"] = "Doppia Uccisione!",
+    ["Drone Hunter!"] = "Cacciatore di Droni!",
+    ["Drowner"] = "Affogato",
+    ["Each turn you get 1-3 random weapons"] = "Ad ogni turno hai da 1 a 3 armi casuali",
+    ["Each turn you get one random weapon"] = "Ad ogno turno hai una sola arma casuale",
 	["Eliminate all enemies"] = "Elimina tutti i nemici",
 	["Eliminate all targets before your time runs out.|You have unlimited ammo for this mission."] = "Distruggi tutti gli obiettivi entro il tempo previsto.|Hai armi illimitate per questa missione.", --Bazooka, Shotgun, SniperRifle
 	["Eliminate Poison before the time runs out"] = "Elimina Veleno prima che il tempo finisca",
-	["Eliminate the Blue Team"] = "Elimina il Blue Team",
---      ["Eliminate the enemy before the time runs out"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
---      ["Eliminate the enemy hogs to win."] = "",
---      ["Eliminate the enemy specialists."] = "",
+	["Eliminate the Blue Team"] = "Elimina la Squadra Blu",
+    ["Eliminate the enemy before the time runs out"] = "Elimina il nemico prima che il tempo scada", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+    ["Eliminate the enemy hogs to win."] = "Elimina i ricci nemici per vincere.",
+    ["Eliminate the enemy specialists."] = "Elimina tutti i nemici specialisti.",
 	["- Eliminate Unit 3378 |- Feeble Resistance must survive"] = "- Elimina l'Unità 3378 |- La Resistenza Finale deve sopravvivere",
---      ["Energetic Engineer"] = "",
+    ["Energetic Engineer"] = "Ingegnere Energetico",
 	["Enjoy the swim..."] = "Nuota con piacere...",
---      ["[Enter]"] = "",
+    ["[Enter]"] = "[Enter]",
 	["Fastest lap: "] = "Giro migliore: ",
 	["Feeble Resistance"] = "Resistenza Finale",
---      ["Fire"] = "",
+	["Fire"] = "Fuoco",
 	["Flag captured!"] = "Bandiera catturata!",
 	["Flag respawned!"] = "Bandiera restituita!",
 	["Flag returned!"] = "Bandiera recuperata!",
---      ["Flags, and their home base will be placed where each team ends their first turn."] = "",
---      ["Flamer"] = "",
---      ["Friendly Fire!"] = "",
---      ["fuel extended!"] = "",
---      ["GAME BEGUN!!!"] = "",
---      ["Game Modifiers: "] = "",
+    ["Flags, and their home base will be placed where each team ends their first turn."] = "Le bandiere saranno piazzate nel luogo in cui le squadre finiscono il loro primo turno",
+    ["Flamer"] = "Incendiario",
+    ["Friendly Fire!"] = "Fuoco Amico!",
+    ["fuel extended!"] = "carburante aggiuntivo",
+    ["GAME BEGUN!!!"] = "IL GIOCO INIZIA!!!",
+    ["Game Modifiers: "] = "Modificatori di Gioco: ",
 	["GAME OVER!"] = "GAME OVER!",
-	["Game Started!"] = "Gioco iniziato!",
+	["Game Started!"] = "Gioco Iniziato!",
 	["Get on over there and take him out!"] = "Vai fuori da qui ed eliminalo!",
---      ["Goal"] = "",
+    ["Goal"] = "Goal",
 	["GO! GO! GO!"] = "VAI! VAI! VAI!",
 	["Good birdy......"] = "Bell'uccellino......",
 	["Good luck out there!"] = "Buona fortuna!",
---      ["Good so far!"] = "",
---      ["Good to go!"] = "",
---      ["GOTCHA!"] = "",
---      ["Grab Mines/Explosives"] = "",
---      ["Hahahaha!"] = "",
---      ["Haha, now THAT would be something!"] = "",
---      ["Hapless Hogs"] = "",
---      [" Hapless Hogs left!"] = "",
---      ["Health crates extend your time."] = "",
---      ["Heavy"] = "",
+    ["Good so far!"] = "Molto bene finora!",
+    ["Good to go!"] = "Vai!!",
+    ["GOTCHA!"] = "COLPITO!!",
+    ["Grab Mines/Explosives"] = "Afferra Mine/Esplosivi",
+    ["Hahahaha!"] = "Hahahaha!",
+    ["Haha, now THAT would be something!"] = "Haha, allora questa pioggia ha davvero qualcosa di strano!",
+    ["Hapless Hogs"] = "Ricci Sfortunati",
+    ["Hapless Hogs left!"] = "Ricci Sfortunati eliminati!",
+    ["Health crates extend your time."] = "La cassa della salute ha aumentato il tuo tempo",
+    ["Heavy"] = "Pesante",
 	["Hedgewars-Basketball"] = "Hedgewars-Pallacanestro",
 	["Hedgewars-Knockball"] = "Hedgewars-Knockball",
---      ["Heh, it's not that bad."] = "",
---      ["Hit Combo!"] = "",
+    ["Heh, it's not that bad."] = "Beh, alla fine non piove così forte.",
+    ["Hit Combo!"] = "Hit Combo!",
 	["Hmmm..."] = "Mmmmm...",
-	["Hooray!"] = "Hurra!!!",
+	["Hooray!"] = "Hurrà!!!",
 	["Hunter"] = "Cacciatore", --Bazooka, Shotgun, SniperRifle
 	["Instructor"] = "Istruttore", -- 01#Boot_Camp, User_Mission_-_Dangerous_Ducklings
---      ["invaders destroyed"] = "",
---      ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "",
---      ["Jumping is disabled"] = "",
---      ["Kamikaze Expert!"] = "",
---      ["Keep it up!"] = "",
---      ["Killing spree!"] = "",
---      ["KILLS"] = "",
---      ["Last Target!"] = "",
---      ["[Left Shift]"] = "",
+    ["invaders destroyed"] = "invasori distrutti",
+    ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Almeno il SUDDEN DEATH arriverà tra 99 turni...",
+    ["Jumping is disabled"] = "Il salto è disattivato",
+    ["Kamikaze Expert!"] = "Kamikaze Esperto!",
+    ["Keep it up!"] = "Mantienilo al sicuro!",
+    ["Killing spree!"] = "Furia Omicida!",
+    ["KILLS"] = "UCCISIONI",
+    ["Last Target!"] = "Ultimo Obiettivo!",
+    ["[Left Shift]"] = "Shift Sinistro",
 	["Listen up, maggot!!"] = "Recluta, Attenzione!!",
---      ["Lively Lifeguard"] = "",
---      ["Mine Deployer"] = "",
---      ["Mine Eater!"] = "",
---      ["|- Mines Time:"] = "|-Timer delle mine:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
+    ["Lively Lifeguard"] = "Bagnino Vivace",
+    ["Mine Deployer"] = "Spintore di Mine",
+    ["Mine Eater!"] = "Mangiatore di Mine!",
+    ["|- Mines Time:"] = "|- Timer delle mine:", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 	["MISSION FAILED"] = "MISSIONE FALLITA", -- User_Mission_-_Dangerous_Ducklings, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 	["MISSION SUCCESSFUL"] = "MISSIONE COMPLETATA CON SUCCESSO", -- User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 	["MISSION SUCCESS"] = "MISSIONE COMPLETATA", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
---      ["Movement: [Up], [Down], [Left], [Right]"] = "",
---      ["Multi-shot!"] = "",
---      ["Nameless Heroes"] = "",
---      ["New Barrels Per Turn"] = "",
---      ["NEW CLAN RECORD: "] = "",
+    ["Movement: [Up], [Down], [Left], [Right]"] = "Movimenti: [Sù], [Giù], [Sinistra], [Destra]",
+    ["Multi-shot!"] = "Colpi multipli!",
+    ["Nameless Heroes"] = "Eroi senza nome",
+    ["New Barrels Per Turn"] = "Nuovi Barrili ad Ogni Turno",
+    ["NEW CLAN RECORD: "] = "NUOVO CLAN RECORD: ",
 	["NEW fastest lap: "] = "Nuovo giro migliore: ",
---      ["New Mines Per Turn"] = "",
---      ["NEW RACE RECORD: "] = "",
---      ["Newton's Hammock"] = "",
---      ["NOT ENOUGH WAYPOINTS"] = "",
+    ["New Mines Per Turn"] = "Nuove Mine ad ogni Turno",
+    ["NEW RACE RECORD: "] = "NUOVO RACE RECORD: ",
+    ["Newton's Hammock"] = "L'Amaca di Newton",
+    ["NOT ENOUGH WAYPOINTS"] = "NON CI SONO ABBASTANZA PUNTI DA PIAZZARE",
 	["Not So Friendly Match"] = "Partita non molto amichevole", -- Basketball, Knockball
 	["Oh no! Just try again!"] = "Oh no! Prova ancora!", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 	["Oh no! Time's up! Just try again."] = "Oh no! Tempo scaduto! Prova ancora!", --Bazooka, Shotgun, SniperRifle
 	["Operation Diver"] = "Operazione Sub",
 	["Opposing Team: "] = "Squadra Nemica: ",
 	["Pathetic Hog #%d"] = "Riccio Patetico #%d",
---      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
---      ["Per-Hog Ammo"] = "",
---      ["Place more waypoints using [ENTER]"] = "",
---      ["Place more waypoints using the 'Air Attack' weapon."] = "",
---      ["points"] = "", -- Control, Space_Invasion
+    ["Pathetic Resistance"] = "Resistenza Patetica", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
+    ["Per-Hog Ammo"] = "Munizioni per Riccio",
+    ["Place more waypoints using [ENTER]"] = "Piazza più punti usando [ENTER]",
+    ["Place more waypoints using the 'Air Attack' weapon."] = "Piazza più punti usando l' 'Attacco Aereo'",
+    ["points"] = "punti", -- Control, Space_Invasion
 	["Poison"] = "Veleno",
---      ["Power Remaining"] = "",
---      ["Prepare yourself"] = "",
---      ["Press [Precise] to skip intro"] = "",
---      ["Race complexity limit reached."] = "",
---      ["RACER"] = "",
+	["Power Remaining"] = "Potenza Rimasta",
+    ["Prepare yourself"] = "Preparati",
+    ["Press [Precise] to skip intro"] = "Premi [Mirino di Precisione] per saltare l'intro",
+    ["Race complexity limit reached."] = "Raggiunto il limite complessivo della corsa.",
+    ["RACER"] = "RACER",
 	[" - Return the enemy flag to your base to score | - First team to 3 captures wins | - You may only score when your flag is in your base | - Hogs will drop the flag if killed, or drowned | - Dropped flags may be returned or recaptured | - Hogs respawn when killed"] = " - Riporta la bandiera nemica alla tua base per guadagnare un punto| - La prima squadra a catturarne 3 vince! | - Puoi guadagnare punti solo quando la tua bandiera si trova nella tua base! | - I ricci lasceranno cadere la bandiera se uccisi o caduti in acqua! | - Le bandiere cadute possono essere restituite o ricatturate! | - I ricci risorgono dalla morte!",
---      ["Round Limit:"] = "",
---      ["Round Limit"] = "",
---      ["Rounds Complete: "] = "",
---      ["Rounds Complete"] = "",
---      ["RULES OF THE GAME [Press ESC to view]"] = "",
+    ["Round Limit:"] = "Limite del Round: ",
+    ["Round Limit"] = "Limite del Round",
+    ["Rounds Complete: "] = "Round Completati: ",
+    ["Rounds Complete"] = "Round Completati",
+    ["RULES OF THE GAME [Press ESC to view]"] = "REGOLE DEL GIOCO [Premi ESC per visualizzarle] ",
 	["RULES OF THE GAME [Press ESC to view]"] = "REGOLE DEL GIOCO (Premi ESC per visualizzarle)",
---      ["s|"] = "",
---      ["Save as many hapless hogs as possible!"] = "",
---      ["SCORE"] = "",
---      ["sec"] = "sec", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
+    ["s|"] = "s|",
+    ["Save as many hapless hogs as possible!"] = "Salva più ricci sfortunati che puoi!",
+    ["SCORE"] = "PUNTEGGIO",
+    ["sec"] = "sec", -- CTF_Blizzard, TrophyRace, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle, User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork, Capture_the_Flag
 	["See ya!"] = "Ci vediamo!",
---      ["selected!"] = "",
---      ["s"] = "", -- GaudyRacer, Space_Invasion
---      ["Shield boosted! +30 power"] = "",
---      ["Shield Depleted"] = "",
---      ["Shield is fully recharged!"] = "",
---      ["Shield Master!"] = "",
---      ["Shield Miser!"] = "",
---      ["Shield OFF:"] = "",
---      ["Shield ON:"] = "",
---      ["Shield Seeker!"] = "",
-	["Shotgun Team"] = "Squadra FaP",
+    ["selected!"] = "selezionato!",
+    ["s"] = "s", -- GaudyRacer, Space_Invasion
+    ["Shield boosted! +30 power"] = "Scudo ricaricato! Potenza +30",
+    ["Shield Depleted"] = "Scudo Esaurito",
+    ["Shield is fully recharged!"] = "Lo scudo è completamente ricaricato!",
+    ["Shield Master!"] = "Maestro dello Scudo!",
+    ["Shield Miser!"] = "Scudo Breve",
+    ["Shield OFF:"] = "Scudo OFF",
+    ["Shield ON:"] = "Scudo ON",
+    ["Shield Seeker!"] = "Cercatore di Scudi",
+	["Shotgun Team"] = "Squadra Shotgun",
 	["Shotgun Training"] = "Allenamento con il Fucile a Pompa",
---      ["shots remaining."] = "",
---      ["Silly"] = "",
---      ["Sinky"] = "",
+    ["shots remaining."] = "colpi rimasti.",
+    ["Silly"] = "Stupido",
+    ["Sinky"] = "Affondato",
 	["%s is out and Team %d|scored a penalty!| |Score:"] = "%s è fuori dal campo e la squadra %d|prende una penalità!| |Punteggio:", -- Basketball, Knockball
-	["%s is out and Team %d|scored a point!| |Score:"] = "?s è fuori dal campo e la squadra %d|guadagna un punto!| |Puntuación:", -- Basketball, Knockball
+	["%s is out and Team %d|scored a point!| |Score:"] = "%s è fuori dal campo e la squadra %d|guadagna un punto!| |Puntuación:", -- Basketball, Knockball
 	["Sniper Training"] = "Addestramento con il Fucile di Precisione",
-	["Sniperz"] = "Squadra FdP",
---      ["Sponge"] = "",
+	["Sniperz"] = "Cecchini",
+    ["Sponge"] = "Spugna",
 	["Spooky Tree"] = "Albero stregato",
---      ["STATUS UPDATE"] = "", -- GaudyRacer, Space_Invasion
---      ["Switched to "] = "",
+    ["STATUS UPDATE"] = "STATUS AGGIORNATO", -- GaudyRacer, Space_Invasion
+    ["Switched to "] = "Cambiato in",
 	["Team %d: "] = "Squadra %d: ",
---      ["Team Scores"] = "", -- Control, Space_Invasion
---      ["That Sinking Feeling"] = "",
---      ["That was pointless."] = "Questo era senza scopo.",
+    ["Team Scores"] = "Punteggi della Squadra", -- Control, Space_Invasion
+    ["That Sinking Feeling"] = "Quella Sensazione d'Affondamento",
+    ["That was pointless."] = "Era senza senso.",
 	["The enemy is hiding out on yonder ducky!"] = "Il nemico si sta nascondendo dietro a quella papera!",
---      ["The flag will respawn next round."] = "La bandiera verrà restituita alla fine del turno.",
---      ["The Nameless One"] = "",
---      ["THE SPECIALISTS"] = "",
---      ["This one's tricky."] = "",
---      ["This rain is really something..."] = "",
---      ["TIME: "] = "",
---      ["Timed Kamikaze!"] = "",
---      ["Time Extended!"] = "",
---      ["Time Extension"] = "",
---      ["Toggle Shield"] = "",
+    ["The flag will respawn next round."] = "La bandiera verrà restituita alla fine del turno.",
+    ["The Nameless One"] = "Il SenzaNome",
+    ["THE SPECIALISTS"] = "GLI SPECIALISTI",
+    ["This one's tricky."] = "Molto difficile",
+    ["This rain is really something..."] = "Questa pioggia ha qualcosa di strano...",
+    ["TIME: "] = "TEMPO: ",
+    ["Timed Kamikaze!"] = "Kamikaze Cronometrato!",
+    ["Time Extended!"] = "Tempo Prolungato!",
+    ["Time Extension"] = "Prolungamento di Tempo",
+    ["Toggle Shield"] = "Scudo Manuale",
 	["Toxic Team"] = "Team Velenoso", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
---      ["TRACK COMPLETED"] = "",
---      ["TRACK FAILED!"] = "",
-	["TrophyRace"] = "TrophyRace",
+    ["TRACK COMPLETED"] = "PISTA COMPLETATA",
+    ["TRACK FAILED!"] = "PISTA FALLITA!",
+	["TrophyRace"] = "Trofeo Race",
 	["T_T"] = "T_T",
---      ["Tumbling Time Extended!"] = "",
---      ["Turn Time"] = "",
---      ["Unit"] = "",
+    ["Tumbling Time Extended!"] = "Tempo di Caduta Prolungato!",
+    ["Turn Time"] = "Tempo di Turno",
+    ["Unit"] = "Unità",
 	["Unit 3378"] = "Unità 3378",
---      ["Unit 835"] = "",
---      ["Unlimited Attacks"] = "",
---      ["Unstoppable!"] = "",
---      ["User Challenge"] = "",
+    ["Unit 835"] = "Unità 835",
+    ["Unlimited Attacks"] = "Attacchi illimitati",
+    ["Unstoppable!"] = "Inarrestabile!",
+    ["User Challenge"] = "Sfida Utente",
 	["Use your rope to get from start to finish as fast as you can!"] = "Usa la tua corda per raggiungere il traguardo il più velocemente possibile!",
---      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
+    ["Victory for the "] = "La vittoria è di", -- CTF_Blizzard, Capture_the_Flag
 	["Victory for the"] = "La vittoria è di",
---      ["Waypoint placed."] = "",
---      ["Way-Points Remaining"] = "",
---      ["Weapons Reset"] = "",
---      ["Well done."] = "",
---      ["Will this ever end?"] = "",
---      ["WINNING TIME: "] = "",
---      ["You'd almost swear the water was rising!"] = "",
-	["You have SCORED!!"] = "Hai guadagnato un PUNTO!",
---      ["You saved"] = "",
-	["You've failed. Try again."] = "Hai fallito. Prova di nuovo!",
+    ["Waypoint placed."] = "Punto piazzato.",
+    ["Way-Points Remaining"] = "Punti Da Piazzare Rimasti.",
+    ["Weapons Reset"] = "Armi Azzerate",
+    ["Well done."] = "Ben fatto.",
+    ["Will this ever end?"] = "Finirà mai?",
+    ["WINNING TIME: "] = "TEMPO VINCENTE: ",
+    ["You'd almost swear the water was rising!"] = "Guarda, l'acqua si sta alzando lentamente!",
+	["You have SCORED!!"] = "Hai guadagnato un PUNTO!!",
+    ["You saved"] = "Hai salvato",
+	["You've failed. Try again."] = "Hai fallito. Prova di nuovo.",
 	["You've reached the goal!| |Time: "] = "Hai raggiunto il traguardo!| |Tempo: ",
-	["'Zooka Team"] = "Squadra 'zooka",
+	["'Zooka Team"] = "'Squadra Zooka",
     }
--- a/share/hedgewars/Data/Locale/it.txt	Thu Nov 24 13:44:30 2011 +0100
+++ b/share/hedgewars/Data/Locale/it.txt	Thu Nov 24 16:18:45 2011 +0100
@@ -12,7 +12,7 @@
 00:09=Desert Eagle
 00:10=Dinamite
 00:11=Mazza da Baseball
-00:12=Pugno di Fuoco
+00:12=Shoryuken
 00:13=sec
 00:14=Paracadute
 00:15=Attacco Missilistico
@@ -36,13 +36,13 @@
 00:33=Danno Extra
 00:34=Invulnerabilità
 00:35=Tempo Extra
-00:36=Mirino LASER
+00:36=Mirino Laser
 00:37=Vampirismo
 00:38=Fucile di Precisione
 00:39=Disco Volante
 00:40=Bomba Molotov
 00:41=Uccellino
-00:42=Dispositivo Portatile per Portali
+00:42=Portal Gun
 00:43=Ultima Sonata
 00:44=Vecchio Limburger
 00:45=Pistola Sinusoidale (beta)
@@ -53,6 +53,9 @@
 00:50=Attacco Perforante
 00:51=Palla di Fango
 00:52=Nessuna arma selezionata
+00:53=Macchina del Tempo
+00:54=Costruzione
+00:55=Land Spray
 
 01:00=Combattiamo!
 01:01=Round in parità
@@ -69,6 +72,12 @@
 01:12=Ultimo turno prima del Sudden Death!
 01:13=%1 turni rimanenti prima del Sudden Death!
 01:14=Preparati, %1!
+01:15=Delicato
+01:16=Basso
+01:17=Medio
+01:18=Alto
+01:19=Forte
+01:20=%1 Rimbalzato
 
 ; Event messages
 ; Hog (%1) died
@@ -77,7 +86,7 @@
 02:00=%1 ha visto la luce!
 02:00=%1 non ha capito cosa stesse succedendo!
 02:00=%1 non sapeva con chi aveva a che fare!
-02:00=%1 ha un appuntamento col Tristo Mietitore
+02:00=%1 ha un appuntamento con l'Oscuro Mietitore
 02:00=%1 puzza di cadavere!
 02:00=%1 ha un grande futuro dietro le spalle
 02:00=%1 è ormai mangime per vermi
@@ -88,16 +97,16 @@
 02:00=%1 non ha pagato il conto!
 02:00=%1 ha rifiutato l'offerta che non poteva rifiutare!
 02:00=%1 ora fa parte del panorama!
+02:00=%1 ha lanciato il suo ultimo missile
+02:00=%1 ha scagliato la sua ultima granata
+02:00=%1 ha infornato la sua ultima torta
+02:00=%1 lascia una moglie e quattro figli...
 02:00=%1 se n'è andato in un posto migliore!
 02:00=%1 saluta questo mondo!
-02:00=%1 incontra il creatore!
+02:00=%1 incontra il Creatore!
 02:00=%1 non può più aspettare!
 02:00=%1 ha finito il suo tempo!
 02:00=%1 sarà ricordato con affetto!
-02:00=%1 ha lanciato il suo ultimo missile!
-02:00=%1 ha scagliato la sua ultima granata!
-02:00=%1 ha infornato la sua ultima torta!
-02:00=%1 ha gettato la sua ultima anguria!
 02:00=%1 se n'è andato per giocare a un gioco migliore!
 02:00=%1 fallisce!
 02:00=%1 avrebbe davvero dovuto usare una cassa salute!
@@ -122,6 +131,13 @@
 02:00=I gatti hanno sette vite, %1 no!
 02:00=%1 è caduto per l'onore della sua squadra!
 02:00=%1 non ama questo gioco
+02:00=Non c'è speranza per %1
+02:00=%1 è morto eroicamente per la patria.
+02:00=%1 ti consiglio vivamente il Tetris
+02:00=%1 vuole la mamma
+02:00=%1 non è morto invano...(forse)
+02:00=L'inferno ti attende, %1
+02:00=%1 vivrà per sempre nei nostri cuori
 
 ; Hog (%1) drowned
 02:01=%1 gioca a fare il sottomarino!
@@ -171,7 +187,11 @@
 02:01=%1 avrebbe dovuto fare qualche lezione di nuoto
 02:01=E' abbastanza salata l'acqua, %1?
 02:01=%1 sprofonda nei più neri abissi
-; Match starts
+02:01=Pazzia...QUESTA E' SPARTAAAAAAAAAAAAAAAAAAAAAAAAA!!
+02:01=%1 è a 20000 leghe sotto i mari
+02:01=%1 è il nuovo amichetto di SpongeBob
+
+; Round starts
 02:02=Combattiamo!
 02:02=Armato e pronto!
 02:02=Alle armi!
@@ -186,7 +206,6 @@
 02:02=Perdere non è un opzione
 02:02=Vittoria o morte
 02:02=Chi perde pulisce!
-02:02=Fai del tuo meglio!
 02:02=Che inizi la battaglia del millennio
 02:02=Che inizi la battaglia del secolo
 02:02=Che inizi la battaglia del decennio
@@ -194,17 +213,23 @@
 02:02=Che inizi la battaglia del mese
 02:02=Che inizi la battaglia della settimana
 02:02=Che inizi la battaglia del giorno
+02:02=Fai del tuo meglio!
+02:02=Distruggi il nemico!
 02:02=Buona fortuna
 02:02=Divertitevi!
 02:02=Combatti con onore!
 02:02=Combatti a oltranza!
 02:02=Mai arrendersi!
 02:02=Nessuna paura!
+02:02=Che la festa abbia inizio!
 02:02=Preparatevi alla gloria!
+
 ; Round ends (win; unused atm)
 02:03=...
+
 ; Round ends (draw; unused atm)
 02:04=...
+
 ; New health crate
 02:05=Pronto soccorso in arrivo!
 02:05=Chi ha bisogno di cure?
@@ -225,6 +250,8 @@
 02:05=Direttamente dall'ospedale!
 02:05=Correte! Casse salute in omaggio!
 02:05=Una superpozione! Ops... gioco sbagliato!
+02:05=Attenzione! Può causare effetti collaterali indesiderati.
+
 ; New ammo crate
 02:06=Altre armi!
 02:06=È qui la festa?!
@@ -232,7 +259,7 @@
 02:06=Armi! Armi! Armi!
 02:06=È ora di ravvivare la serata!
 02:06=Mi chiedo che arma ci sia là...
-02:06=Il natale arriva presto in Hedgewars
+02:06=Il Natale arriva presto in Hedgewars
 02:06=Un regalo!
 02:06=Consegna speciale!
 02:06=È stato un incubo farlo passare in dogana...
@@ -250,6 +277,7 @@
 02:06=Regali per ricci simpatici!
 02:06=Con questo non avrai più problemi!
 02:06=Nuove armi solo per te!
+
 ; New utility crate
 02:07=Attrezzi per tutti!
 02:07=Nuovi accessori per la casa!
@@ -261,6 +289,7 @@
 02:07=Oooh questa cassa è pesante
 02:07=Potrebbe servirti
 02:07=Utilissime queste utilità!
+
 ; Hog (%1) skips his turn
 02:08=%1 è così noioso...
 02:08=%1 deve riordinare le idee
@@ -295,6 +324,9 @@
 02:08=%1 adotta una nuova strategia
 02:08=%1 preferisce rimanere neutrale
 02:08=%1 ha alzato la bandiera bianca
+02:08=%Che vergogna!
+02:08=Se ci fosse stato Chuck Norris dietro di te, ti avrebbe preso a calci volanti
+02:08=%1 pensava troppo alle donnine nude
 
 ; Hog (%1) hurts himself only
 02:09=%1 dovrebbe migliorare la sua mira!
@@ -321,7 +353,7 @@
 02:09=%1 è decisamente goffo
 02:09=%1 mostra al nemico di cosa è capace
 02:09=%1 non può aspettarsi di esser sempre bravo
-02:09=Non preoccuparti %1, nettuno è persetto
+02:09=Non preoccuparti %1, nessuno è perfetto
 02:09=%1 l'ha fatto chiaramente di proposito
 02:09=Non lo dirò a nessuno se non vuoi, %1
 02:09=Imbarazzante!
@@ -333,11 +365,20 @@
 02:09=Il colpo peggiore. Della storia.
 02:09=%1 fa la figura del peracottaio
 02:09=%1 fa la figura del cioccolataio
+02:09=%1 aiuta il nemico!
+02:09=Sono sicuro che nessuno l'abbia visto, %1
+02:09=No comment.
 
 ; Hog shot an home run (using the bat and another hog)
 02:10=Un fuori campo!
 02:10=E' un uccello, è un aereo, ...
-02:10=Quello lì è fuori!
+02:10=E' fuori!
+02:10=BEL COLPO!
+
+; Hog (%1) has to leave (team is gone)
+02:11=%1 deve andare a nanna! 
+02:11=%1 sembra che non abbia tempo per giocare
+02:11=%1 se ne deve andare.
 
 ; Weapon Categories
 03:00=Granata a tempo
@@ -358,7 +399,7 @@
 03:15=Attacco Aereo
 03:16=Attacco Aereo
 03:17=Strumeno di Scavo
-03:18=Utilitàdi costruzione
+03:18=Utilità di costruzione
 03:19=Mezzo di Trasporto
 03:20=Azione di Cambio
 03:21=Arma Balistica
@@ -392,23 +433,28 @@
 03:48=E' tempo di martellate!
 03:49=Antica Arte Mistica
 03:50=Attacco Aereo
+03:51=Trovata per terra
+03:52=NON USATO
+03:53=Modello N.40
+03:54=Costruisce qualcosa
+03:55=Utilità di costruzione
 
 ; Weapon Descriptions (use | as line breaks)
-04:00=Attacca i tuoi nemici con una semplice granata.|Esploderà quando il suo timer arriverà a zero.|1-5: Imposta il timer della granata|Attacco: Tieni premuto per lanciare con più forza
-04:01=Attacca i tuoi nemici con una bomba a grappolo.|Si dividerà in bombe più piccole quando il suo|timer arriverà a zero.|1-5: Imposta il timer della granata|Attacco: Tieni premuto per lanciare con più forza
+04:00=Attacca i tuoi nemici con una semplice granata.|Esploderà quando il timer arriverà a zero.|1-5: Imposta il timer della granata|Attacco: Tieni premuto per lanciare con più forza
+04:01=Attacca i tuoi nemici con una bomba a grappolo.|Si dividerà in bombe più piccole quando il |timer arriverà a zero.|1-5: Imposta il timer della granata|Attacco: Tieni premuto per lanciare con più forza
 04:02=Attacca i nemici usando un proiettile balistico|che può essere influenzato dal vento.|Attacco: Tieni premuto per sparare con più potenza
-04:03=Lancia un'ape esplosiva che cercerà il|bersaglio scelto. Non sparare alla massima potenza|per migliorarne la precisione.|Cursore: Scegli il bersaglio|Attacco: Tieni premuto per sparare con più potenza
-04:04=Attacca i nemici usando un fucile con due colpi.|Grazie al suo raggio non hai bisogno di un colpo|diretto per ferire i nemici.|Attacco: Spara (più volte)
+04:03=Lancia un'ape esplosiva che cercherà il|bersaglio scelto. Non sparare alla massima potenza|per migliorarne la precisione.|Cursore: Scegli il bersaglio|Attacco: Tieni premuto per sparare con più potenza
+04:04=Attacca i nemici usando i due colpi del fucile.|Grazie al suo raggio non hai bisogno di un colpo|diretto per ferire i nemici.|Attacco: Spara (più volte)
 04:05=Spostati sottoterra! Usa il martello pneumatico|per scavare un buco nel terreno e raggiungere|altre zone.|Attacco: Inizia o ferma lo scavo
 04:06=Annoiato? Non hai modo di attaccare? Non vuoi|sprecare munizioni? Nessun problema!|Salta il turno, codardo!|Attacco: Salta il turno senza combattere
-04:07=Copri lunghe distanze usando colpi precisi del|rampino. Usa la tua inerzia per scivolare contro altri|ricci o fai cadere granate o altre armi|su di loro.|Attacco: Spara o rilascia il rampino|Salto Lungo: Lascia granate o armi simili
+04:07=Copri lunghe distanze usando colpi precisi del|rampino. Usa la tua inerzia per scivolare contro altri|ricci o fai cadere granate o altre armi|su di loro.|Attacco: Spara o rilascia il rampino|Salto Lungo: Lascia cadere granate o armi simili
 04:08=Tieni i tuoi nemici alla larga lasciando una|mina in passaggi stretti o proprio sotto i loro|piedi. Assicurati di scappare prima di azionarla|tu stesso!|Attacco: Lascia la mina davanti a te
 04:09=Non confidi nella tua mira? Usa la Desert|Eagle per attaccare usando fino a quattro colpi.|Attacco: Spara (quattro volte)
 04:10=La forza bruta è sempre un'opzione. Lascia questo|classico esplosivo vicino ai tuoi nemici e|batti in ritirata.|Attacco: Lascia la dinamite davanti a te
 04:11=Liberati dei ricci nemici battendoli oltre|i bordi della mappa o nell'acqua. Oppure che|ne diresti di buttare alcune mine ai|tuoi amici?|Attacco: colpisci qualunque cosa di fronte a te
 04:12=Avvicinati faccia a faccia per scatenare il|potere di questa mortale tecnica di arti marziali.|Attacco: esegue il Pugno di Fuoco
 04:13=NON USATO
-04:14=Soffri di vertigini? Meglio avere un paracadute.|Si aprirà quando|cadrete da troppo in alto|e salverà il vostro riccio dai|danni da caduta.|Attacco: Apre il paracadute
+04:14=Soffri di vertigini? Meglio avere un paracadute.|Si aprirà quando|cadrete da troppo in alto|e salverà il vostro riccio dai|danni da caduta.|Attacco: Apre il paracadute|Salto Lungo: lascia cadere granate o armi simili
 04:15=Chiama un aeroplano per attaccare i nemici|usando un bombardamento a tappeto.|Destra/Sinistra: Determina la direzione dell'attacco|Cursore: Sceglie la zona da attaccare
 04:16=Chiama un aeroplano che butterà diverse mine|nell'area scelta.|Destra/Sinistra: Determina la direzione dell'attacco|Cursore: Sceglie la zona da attaccare
 04:17=Serve un riparo? Usate la Torcia Infuocata|per scavare un tunnel nel terreno e|garantirvi una copertura.|Attacco: Inizia o smetti di scavare
@@ -419,13 +465,13 @@
 04:22=Non solo per Indiana Jones! La frusta è una|utile arma in molte situazioni. Specialmente|quando si vuole spingere qualcuno giù da un|burrone.|Attacco: Colpisci qualunque cosa di fronte a te
 04:23=Se non avete niente da perdere, questo può|esservi d'aiuto. Sacrificate il vostro riccio|lanciandolo in una direzione, facendogli urtare|tutto ciò che incontra per poi esplodere alla fine.|Attacco: Lancia il mortale e devastante attacco
 04:24=Buon Compleanno! Lancia questa torta, falla camminare|fino ai tuoi nemici e lasciagli avere un party|esplosivo. La torta può passare quasi tutti i terreni|ma potrebbe detonare prima in questo modo.|Attacco: Avvia la torta o fermala per farla esplodere
-04:25=Usa questo kit di travestimento per far saltare|i nemici verso il tuo riccio (e in qualche|precipzio o buco).|Attacco: Usa il kit e cerca di sedurre un altro riccio
+04:25=Usa questo kit di travestimento per far saltare|i nemici verso il tuo riccio (e in qualche|precipizio o buco).|Attacco: Usa il kit e cerca di sedurre un altro riccio
 04:26=Lancia questa succosa anguria ai tuoi nemici.|Quando il timer finirà, si dividerà in molti altri|pezzi esplosivi.|1-5: Imposta il timer dell'anguria|Attacco: Tieni premuto per lanciare con più forza
 04:27=Lascia che il fuoco dell'inferno cada sui nemici|usando questo diabolico esplosivo. Non|avvicinarti troppo all'esplosione dato che piccoli|fuochi possono perdurare di più.|Attacco: Tieni premuto per lanciare con più forza
 04:28=Poco dopo averlo lanciato, questo razzo inizierà|a scavare attraverso il terreno ed esploderà|quando la sua spoletta verrà azionata o tornerà|di nuovo in superficie.|Attacco: Tieni premuto per lanciare con più forza
 04:29=Questa non è adatta ai bambini! La Sparapalle spara|tonnellate di piccole palline colorate riempite di|esplosivo.|Attacco: Spara alla massima potenza|Su/Giu: Continua a mirare
-04:30=Chiama un aeroplano per lanciare un potente|attacco aereo napalm. Con la giusta mira questo attacco|può sradicare grandi zone di terreno, inclusi|gli sfortunati ricci nella zona.|Destra/Sinitra: Determina la direzione dell'attacco|Cursore: Sceglie la zona da attaccare
-04:31=L'Aereo Radiocomandato è l'arma ideale per|raccogliere casse attaccare ricci lontani. Potete|sterzare contro i nemici o lasciargli cadere alcune|bombe prima di farlo.|Attacco: Lancia l'Aereo o lascia le bombe|Salto Lungo: Fai cavalcare le Valchirie in battaglia|Su/Giu: Manovra l'aereo
+04:30=Chiama un aeroplano per lanciare un potente|attacco napalm. Con la giusta mira questo attacco|può sradicare grandi zone di terreno, inclusi|gli sfortunati ricci nella zona.|Destra/Sinitra: Determina la direzione dell'attacco|Cursore: Sceglie la zona da attaccare
+04:31=L'Aereo Radiocomandato è l'arma ideale per|raccogliere casse e attaccare ricci lontani. Potete|sterzare contro i nemici o lasciargli cadere alcune|bombe prima di farlo.|Attacco: Lancia l'Aereo o lascia le bombe|Salto Lungo: Fai cavalcare le Valchirie in battaglia|Su/Giù/Sinistra/Destra: Manovra l'aereo
 04:32=La bassa gravità è più funzionale di ogni dieta!|Saltate più in alto e coprite grandi distanze o fate|volare i nemici ancora più lontano.|Attacco: Attiva
 04:33=A volte è necessaria quella piccola spintarella in|più per causare più danni.|Attacco: Attiva
 04:34=Non potete toccarmi!|Attacco: Attiva
@@ -436,16 +482,20 @@
 04:39=Vola in un'altra parte della mappa usando il|disco volante. Questo veicolo difficile da imparare|è in grado di portarvi quasi in ogni zona del|campo di battaglia.|Lo potete usare anche per andare sott'acqua!|Attacco: Attiva|Su/Destra/Sinistra: Applica forza in una direzione
 04:40=Dai fuoco a una parte di terreno usando questa|bottiglia piena di liquido infiammabile.|Attacco: Tieni premuto per lanciare con più potenza
 04:41=La prova che la natura può persino fare meglio|del disco volante. L'uccellino può trasportare|il vostro riccio e bombardare di uova i nemici!|Attacco: Attiva e lancia le uova|Su/Giu/Destra/Sinistra: Vola in una direzione
-04:42=Questo creatore portatile di portali|può trasferire all'istante voi, i vostri nemici|o le vostre armi da un punto all'altro del|terreno.|Usatelo con accortezza e potrà riverlarsi|la vostra arma vincente!|Attacco: Lancia un portale|Tab: Cambia il colore del portale
+04:42=Questo dispositivo portatile crea dei portali dimensionali|che possono trasferire all'istante voi, i vostri nemici|o le vostre armi da un punto all'altro del|terreno.|Usatelo saggiamente e potrà riverlarsi...un GRANDE SUCCESSO!|Attacco: Lancia un portale|Tab: Cambia il colore del portale
 04:43=Do! Re! Mi! Fa! Sol! La! Si!|Suonate il mitico pianoforte di Beathoven e|sarà un successo esplosivo!|Il pianoforte cadrà dal cielo ma|qualcuno deve suonarlo e questo costerà|la sua vita!|Cursore: Sceglie la zona da attaccare|F1-F9: Suona il pianoforte
 04:44=Questo non è normale formaggio, è guerriglia biologica!| Non farà un gran danno al momento dell'esplosione|ma avvelenerà chiunque ne senta lo spiacevole odore!|1-5: Imposta il timer del limburger|Attacco: Tieni premuto per lanciare con più forza
 04:45=Tutto il potere della fisica e della scienza in|mano vostra con questa potente arma|in grado di generare una potente curva|sinusoidale di pura energia.|Attenzione! Questa arma vi darà un forte|contraccolpo (ancora in versione beta)|Attacco: Spara
 04:46=Lanciate delle brucianti fiamme contro i vostri nemici.|Assolutamente scottante!|Attacco: Attiva|Su/Giù: Continua a mirare|Sinistra/Destra: Modifica la potenza di fuoriuscita delle fiamme
 04:47=Raddoppiate il divertimento con due appiccicose mine.|Usatele per difendervi o creare potenti reazioni a catena (o ambedue le cose!)|Attacco: Tieni premuto per lanciare con più forza (due volte)
 04:48=Colpite i vostri nemici con forza!|Un buon colpo di questo martello toglierà|un terzo della vita della vittima e la farà|sprofondare nel terreno.|Attacco: Attiva
-04:49=Risuscitate i vostri ricci morti in battaglia.|Ma attenzione a non risuscitare i vostri nemici!|Attacco: Tieni premuto per risuscitare lentamente|Su: Accelera la risurrezione
-04:50=Scavate dall'alto verso il basso!|Con questo attacco aereo è possibile scavare a fondo grazie|a cinque razzi trivella lanciati dall'alto, che colpiranno|tutto quello che sarà a tiro.|Cursore: Sceglie la zona da attaccare
+04:49=Resuscitate i vostri ricci morti in battaglia.|Ma attenzione a non resuscitare i vostri nemici!|Attacco: Tieni premuto per risuscitare lentamente|Su: Accelera la risurrezione
+04:50=Scavate dall'alto verso il basso!|Con questo attacco aereo è possibile scavare a fondo grazie|a cinque razzi trivella lanciati dall'alto, che colpiranno|tutto quello che sarà a tiro.|Il timer indica fin quanto possono scavare prima di esplodere.|Cursore: Sceglie la zona da attaccare
 04:51=Spingete i nemici in acqua o sopra le mine!|Questa semplice arma non farà molti danni ma|spingerà con forza i nemici che colpisce!|Nei temi Snow e Christmas è una palla di neve!|Attacco: Tieni premuto per lanciare con più forza
+04:52=NON USATO
+04:53=Avventurati attraverso lo spazio-tempo,|lasciando che i tuoi compagni se la sbrigano da soli.|Preparati a ritornare in qualsiasi momento,|o per il Sudden Death o se sono stati tutti sconfitti.|Attenzione. Non funziona durante il Sudden Death,|se sei rimasto da solo, o se sei il Re.
+04:54=INCOMPLETO                                                                                                                                    
+04:55=Spruzza della schiuma attaccaticcia.|Utile per costruire ponti, seppellire nemici, sigillare tunnel.|Usate con cautela!
 
 ; Game goal strings
 05:00=Modalità di Gioco
@@ -469,3 +519,4 @@
 05:18=Attacchi illimitati
 05:19=Le armi verranno resettate allo stato di partenza alla fine di ogni turno
 05:20=Le armi non sono condivise tra i ricci della stessa squadra
+05:21=Tag Team: Le squadre amiche guadagnano dei turni|Tempo di condivisione: le squadre tra di loro condividono lo stesso tempo di turno
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Locale/missions_pl.txt	Thu Nov 24 16:18:45 2011 +0100
@@ -0,0 +1,32 @@
+Basic_Training_-_Bazooka.name=Podstawy korzystania z bazooki
+Basic_Training_-_Bazooka.desc="Pamiętaj o tym, że wiatr może działać na twoją korzyść!"
+
+Basic_Training_-_Grenade.name=Podstawy rzucania granatami
+Basic_Training_-_Grenade.desc="Najpierw wyciÄ…gasz zawleczkÄ™, POTEM rzucasz!"
+
+Basic_Training_-_Shotgun.name=Podstawy strzelania ze strzelby
+Basic_Training_-_Shotgun.desc="Wpierw strzelaj. Pytania zadasz później."
+
+Basic_Training_-_Sniper_Rifle.name=Podstawy strzelania ze snajperki
+Basic_Training_-_Sniper_Rifle.desc="Jeden strzał i kolejny jeż pójdzie do piachu."
+
+User_Mission_-_Dangerous_Ducklings.name=Kryptonim: Niebezpieczne Kaczki
+User_Mission_-_Dangerous_Ducklings.desc="Dobra Żółtodziobie! Zobaczymy czego się nauczyłeś na treningu!!!"
+
+User_Mission_-_Diver.name=Kryptonim: Nurek
+User_Mission_-_Diver.desc="To będzie kolejna "mokra robota"..."
+
+User_Mission_-_Teamwork.name=Kryptonim: Praca zespołowa
+User_Mission_-_Teamwork.desc="Miłość potrafi czasem zranić."
+
+User_Mission_-_Spooky_Tree.name=Kryptonim: Straszne drzewo
+User_Mission_-_Spooky_Tree.desc="Na tym drzewie rośnie bardzo dużo skrzynek. Mam tylko nadzieję, że ten ptak nie jest głodny"
+
+User_Mission_-_Bamboo_Thicket.name=Kryptonim: Bambusowy bór
+User_Mission_-_Bamboo_Thicket.desc="Śmierć nadchodzi z góry."
+
+User_Mission_-_That_Sinking_Feeling.name=Kryptonim: Cisza na morzu
+User_Mission_-_That_Sinking_Feeling.desc="Morze jest wzburzone, a czas szybko upływa. Wielu próbowało, ale nikomu nie udało się wszystkich uratować. Czy ty będziesz pierwszy?"
+
+User_Mission_-_Newton_and_the_Hammock.name=Kryptonim: Newton i jego hamak
+User_Mission_-_Newton_and_the_Hammock.desc="Zapamiętajcie jeżyki: Prędkość ciała nie zmienia się, chyba że działa na nie inna siła!"
--- a/share/hedgewars/Data/Locale/pl.lua	Thu Nov 24 13:44:30 2011 +0100
+++ b/share/hedgewars/Data/Locale/pl.lua	Thu Nov 24 16:18:45 2011 +0100
@@ -17,7 +17,7 @@
     ["Barrel Eater!"] = "Pożeracz Beczek!",
     ["Barrel Launcher"] = "Wyrzutnia Beczek",
     ["Bat balls at your enemies and|push them into the sea!"] = "Uderzaj piłkami w swoich przeciwników|i strącaj ich do wody!",
-    ["Bat your opponents through the|baskets and out of the map!"] = "Uderzaj swoich przekiwników|wyrzucając przez kosz, poza mapę!",
+    ["Bat your opponents through the|baskets and out of the map!"] = "Uderzaj swoich przeciwników|wyrzucając przez kosz, poza mapę!",
     ["Bazooka Training"] = "Trening bazooki",
     ["Best laps per team: "] = "Najszybsze okrążenie drużyny: ",
     ["Best Team Times: "] = "Najlepszy czas zespołów",
@@ -26,7 +26,7 @@
     ["BOOM!"] = "BUM!",
     ["Boss defeated!"] = "Boss pokonany!",
     ["Boss Slayer!"] = "Pogromca bossów",
-    ["Build a track and race."] = "Zbuduj trasię i ścigaj się.",
+    ["Build a track and race."] = "Zbuduj trasę i ścigaj się.",
     ["CAPTURE THE FLAG"] = "PRZECHWYĆ FLAGĘ",
     ["Careless"] = "Nieostrożny",
     ["Change Weapon"] = "Zmień broń",
@@ -66,7 +66,7 @@
     ["Flag captured!"] = "Flaga przechwycona!",
     ["Flag respawned!"] = "Flaga przywrócona!",
     ["Flag returned!"] = "Flaga odzyskana!",
-    ["Flags, and their home base will be placed where each team ends their first turn."] = "Flagi i baza zostaną umieszzcone tam gdzie zespół zakończy swą pierwszą turę.",
+    ["Flags, and their home base will be placed where each team ends their first turn."] = "Flagi i baza zostaną umieszczone tam gdzie zespół zakończy swą pierwszą turę.",
 --      ["Flamer"] = "",
 --      ["Friendly Fire!"] = "",
     ["fuel extended!"] = "zdobyto paliwo",
@@ -97,7 +97,7 @@
     ["Hooray!"] = "Hurraaa!",
     ["Hunter"] = "Strzelec",  
     ["Instructor"] = "Instruktor",  
-    ["invaders destroyed"] = "najeźdzców zniszczonych",
+    ["invaders destroyed"] = "najeźdźców zniszczonych",
     ["It's a good thing SUDDEN DEATH is 99 turns away..."] = "Jak to dobrze, że Nagła Śmierć jest dopiero za 99 tur...",
     ["Jumping is disabled"] = "Skakanie jest niemożliwe",
 --      ["Kamikaze Expert!"] = "",
@@ -129,10 +129,10 @@
     ["Oh no! Time's up! Just try again."] = "Ajajaj! Koniec czasu! Spróbuj jeszcze raz.",  
     ["Operation Diver"] = "Operacja Nurek",
     ["Opposing Team: "] = "Przeciwna drużyna",
-    ["Pathetic Hog #%d"] = "Załosny Jeż #%d",
+    ["Pathetic Hog #%d"] = "Żałosny Jeż #%d",
 --      ["Pathetic Resistance"] = "", -- User_Mission_-_Bamboo_Thicket, User_Mission_-_Newton_and_the_Hammock
     ["Per-Hog Ammo"] = "Oddzielna amunicja dla jeży",
-    ["Place more waypoints using [ENTER]"] = "Postaw więcej punktów orientacyjnych za pomocą [Entera]",
+    ["Place more waypoints using [ENTER]"] = "Postaw więcej punktów orientacyjnych za pomocą [Enteru]",
     ["Place more waypoints using the 'Air Attack' weapon."] = "Postaw więcej punktów orientacyjnych używając [Nalotu]",
     ["points"] = "punkty", -- Control, CTF_Blizzard, Basic_Training_-_Bazooka, Basic_Training_-_Shotgun, Basic_Training_-_Sniper_Rifle
     ["Poison"] = "Truciciel",
@@ -203,7 +203,7 @@
 --      ["Unlimited Attacks"] = "",
     ["Unstoppable!"] = "Nie do zatrzymania!",
 --      ["User Challenge"] = "",
-    ["Use your rope to get from start to finish as fast as you can!"] = "Użyj liny by jak najszybciej dotrzec od startu do mety",
+    ["Use your rope to get from start to finish as fast as you can!"] = "Użyj liny by jak najszybciej dotrzeć od startu do mety",
     ["Victory for the "] = "Zwycięstwo przypadło",
     ["Waypoint placed."] = "Postawiono punkt kontrolny",
     ["Way-Points Remaining"] = "Pozostało punktów: ",
--- a/share/hedgewars/Data/Locale/pl.txt	Thu Nov 24 13:44:30 2011 +0100
+++ b/share/hedgewars/Data/Locale/pl.txt	Thu Nov 24 16:18:45 2011 +0100
@@ -12,7 +12,7 @@
 00:09=Desert Eagle
 00:10=Dynamit
 00:11=Kij bejsbolowy
-00:12=Shoryuken
+00:12=Ognista pięść
 00:13=sek
 00:14=Spadochron
 00:15=Nalot
@@ -185,7 +185,7 @@
 02:01=%1 podnosi poziom oceanu
 02:01=%1 nie zapisał się do marynarki.
 02:01=%1 robi za śniętą rybę...
-02:01=Przynajmmniej nie utonÄ…Å‚eÅ› w muszli klozetowej, %1
+02:01=Przynajmniej nie utonÄ…Å‚eÅ› w muszli klozetowej, %1
 02:01=%1 nie pobił Sonica w pływaniu
 02:01=%1 będzie grał w "Uwolnić Orkę"
 02:01=%1 szuka rybek do akwarium!
@@ -223,16 +223,16 @@
 02:02=Rozpoczynajmy walkÄ™!
 02:02=Jedziemy z koksem!
 02:02=Rozpoczynamy tÄ… imprezÄ™!
-02:02=Ostani żywy jeż wygrywa!
+02:02=Ostatni żywy jeż wygrywa!
 02:02=Jazda!
 02:02=Rozkręćmy tą imprezę!
 02:02=To jest dopiero poczÄ…tek...
 02:02=To jest poczÄ…tek czegoÅ› naprawdÄ™ wielkiego!
 02:02=Witamy w Hedgewars.
 02:02=Witaj na linii frontu!
-02:02=Zgnieć swoich przeciników!
+02:02=Zgnieć swoich przeciwników!
 02:02=Niech wygra lepszy!
-02:02=Zwycięztwo albo śmierć!
+02:02=Zwycięstwo albo śmierć!
 02:02=Zwycięzca zdobywa łup!
 02:02=Przegrana nie wchodzi w rachubÄ™.
 02:02=Hedgewars, stworzone przez Hedgewars.org
@@ -295,7 +295,7 @@
 02:05=Najwięcej witaminy mają paczki od rodziny!
 02:05=Czy ktoś wzywał doktor Zosię?
 02:05=Oby to nie był Pavulon!
-02:05=Codziena dawka Panadolu!
+02:05=Codzienna dawka Panadolu!
 02:05=Chyba Goździkowa maczała w tym palce...
 02:05=Gdzie jest Doktor Queen?
 02:05=U mnie to jak u lekarza!
@@ -355,7 +355,7 @@
 02:07=Keczup prosto od MacGyvera!
 02:07=Zestaw Małego Majsterkowicza
 02:07=Darmowa paczka narzędzi!
-02:07=Zasobniki prosto z Ameryki!
+02:07=Zasobniki od wujka z Ameryki!
 02:07=Zapasy materiałów eksploatacyjnych!
 02:07=Dorwij przeciwnika szybciej z nowymi narzędziami
 
@@ -471,7 +471,7 @@
 02:10=Iiii Leciiii...
 02:10=Bzziuuuuu!
 02:10=Niezły rzut!
-02:10=Chyba padnie rekord Guinessa w rzucie jeżem!
+02:10=Chyba padnie rekord Guinnessa w rzucie jeżem!
 02:10=To było odlotowe!
 
 ; Hog (%1) has to leave (team is gone)
@@ -544,12 +544,12 @@
 04:00=Atakuj przeciwników zwykłym granatem.|Wybuchnie kiedy zapalnik skończy odliczanie.|1-5: Ustawia zapalnik|Atak: Przytrzymaj by rzucić z większą siłą
 04:01=Atakuj przeciwników granatem odłamkowym.|Rozpadnie się on na kilka odłamków gdy zapalnik|skończy odliczanie.|1-5: Ustawia zapalnik|Atak: Przytrzymaj by rzucić z większą siłą
 04:02=Atakuj przeciwników pociskiem balistycznym,|który jest podatny na wiatr.|Atak: Przytrzymaj by strzelić z większą siłą
-04:03=Wypuść zdenerwowaną pszczołe, która "użądli"|zaznaczony cel. By zwiększyć precyzję nie|strzelaj pełną mocą|Kursor: Wybierz cel|Atak: Przytrzymaj by strzelić z większą siłą
+04:03=Wypuść zdenerwowaną Pszczołę, która "użądli"|zaznaczony cel. By zwiększyć precyzję nie|strzelaj pełną mocą|Kursor: Wybierz cel|Atak: Przytrzymaj by strzelić z większą siłą
 04:04=Atakuj przeciwników strzelbą z dwoma strzałami.|Działa obszarowo, więc nie musisz dokładnie|celować by zranić przeciwników.|Atak: Strzel (kilka razy)
-04:05=Schowaj się pod ziemię! Użyj młota pneumatycznego|do wywiercenia dziury w podłożu i dostania się do|innych miejsc.|Attack: Zacznij/Zakończ kopać 
+04:05=Schowaj się pod ziemię! Użyj młota pneumatycznego|do wywiercenia dziury w podłożu i dostania się do|innych miejsc.|Atak: Zacznij/Zakończ kopać 
 04:06=Znudzony? Brak motywacji do ataku? Oszczędzasz broń?|No problemo! Po prostu pomiń turę, tchórzu!|Atak: Pomiń turę bez walki
 04:07=Skróć wielkie odległości używając liny. Rozpędź się|by wślizgnąć się w inne jeże lub upuścić na nich|granat albo inną broń.|Atak: Rozwiń albo odłącz linę|Długi skok: Upuść granat lub podobną broń      
-04:08=Trzymaj przeciwników na dystans przez upuszczenie|miny w wąskim przejściu lub zaraz obok ich stóp. I nie|zapomnij ucieć zanim się włączy!|Atak: Upuść minę obok siebie
+04:08=Trzymaj przeciwników na dystans przez upuszczenie|miny w wąskim przejściu lub zaraz obok ich stóp. I nie|zapomnij uciec zanim się włączy!|Atak: Upuść minę obok siebie
 04:09=Niepewny co do umiejętności w celowaniu?|Weź pistolet i powystrzelaj ich jak kaczki.|Atak: Strzel (kilka razy)
 04:10=Brutalna siła zawsze jest rozwiązaniem. Upuść ten|wybuchową laskę dynamitu obok przeciwnika i|uciekaj gdzie pieprz rośnie.|Atak: Upuść dynamit obok siebie
 04:11=Uwolnij się od przeciwników poprzez spałowanie|ich poza mapę albo do wody. A co powiesz o|strąceniu min w swoich wrogów?|Atak: Spałuj wszystko co jest przed tobą
@@ -563,26 +563,26 @@
 04:19=Teleport użyty w odpowiednim momencie, staje|się potężniejszy niż każda inna broń,|ponieważ potrafi wyzwolić jeża z tarapatów|w przeciągu sekund.|Kursor: Wybierz region
 04:20=Pozwala w tej turze zagrać innym jeżem.|Atak: Uaktywnij wybieranie jeża
 04:21=Odpal moździerz, który po uderzeniu|wypuści kilka bomb.|Atak: Strzel z całą mocą      
-04:22=Nie tylko dla Indiana Jones! Ten bicz może|być użyteczny w wielu wypadkach. Szczególnie|kiedy chcesz kogoś zrzucić z urwiska.|Atak: Zbiczuj wszystko co jest przed tobą
+04:22=Nie tylko dla Indiana Jones! Ten bicz może|być użyteczny w wielu wypadkach. Szczególnie|kiedy chcesz kogoś zrzucić z urwiska.|Atak: Ubiczuj wszystko co jest przed tobą
 04:23=Jeśli nie masz nic do stracenia, ten atak może być|całkiem użyteczny. Poświęć swojego jeża i poślij|go w odpowiednim kierunku, raniąc wszystkich po|drodze i eksplodując na końcu.|Atak: Odpal tę niszczycielską i zabójczą technikę
 04:24=Sto lat! Uruchom ciasto i pozwól mu pójść w stronę|twoich przeciwników urządzając im wybuchowe przyjęcie.|Może chodzić prawie po wszystkim, ale wtedy|wcześniej eksploduje.|Atak: Odpal ciasto albo zatrzymaj je, by wybuchło
 04:25=Użyj kostiumu by sprawić, żeby twój wróg zakochał się|w Tobie (i spadł w przepaść lub dziurę).|Atak: Użyj kostiumu i uwiedź jeża
 04:26=Rzuć tego smacznego arbuza w przeciwników. Kiedy jego|zapalnik wskaże zero, podzieli się na mniejsze kawałki.|1-5: Ustawia zapalnik arbuza|Atak: Przytrzymaj by rzucić z większą siłą
 04:27=Niech ognie piekielne ogarną twoich przeciwników!|Nie podchodź zbyt blisko po wybuchu, gdyż ogień|pali się przez dłuższy czas|Atak: Przytrzymaj by rzucić z większą siłą
 04:28=Krótko po wystrzeleniu, rakieta zacznie wiercić tunel w ziemi|i eksploduje gdy zapalnik zostanie uruchomiony lub|jeśli pojawi się po drugiej stronie terenu.|Atak: Przytrzymaj by strzelić z większą siłą   
-04:29=Tego nie powinny używać dzieci!|Pistolet na kulki wystrzeliwujetony małych|kolorowych kulek wypełnionych materiałem wybuchowym.|Atak: Strzel kulkami|Góra/Dół: Kontynuuj celowanie      
+04:29=Tego nie powinny używać dzieci!|Pistolet na kulki wystrzeliwuje tony małych|kolorowych kulek wypełnionych materiałem wybuchowym.|Atak: Strzel kulkami|Góra/Dół: Kontynuuj celowanie      
 04:30=Wezwij samolot, żeby zrzucić dużą ilość|napalmu. Dzięki dobremu celowi ten atak|może zlikwidować dużą część mapy, w tym|znajdujące się tam nieszczęsne jeże.|Lewo/Prawo: Określ kierunek ataku|Kursor: Wybierz region
 04:31=Zaatakuj odległych przeciwników, bądź zbierz|skrzynki! Nie zapomnij o zrzuceniu bomb!|Góra/Dół: Steruj samolotem|Atak: Zrzuć bombę (3x) |Długi skok: Niech walkirie wkroczą na pole bitwy!
 04:32=Niska grawitacja jest lepsza od diety! Skacz|wyżej i dalej albo pozwól przeciwnikom fruwać.|Atak: Aktywuj
 04:33=Czasami potrzebujesz dodatkowego kopa|żeby zadawać większe obrażenia.|Atak: Aktywuj
 04:34=Nie dotkniesz mnie!|Atak: Aktywuj
 04:35=Czasami bywa, że czas pędzi za szybko. Zyskaj kilka|dodatkowych sekund by dokończyć swój atak.|Atak: Aktywuj
-04:36=Czasami z celowaniem u ciebie jest kiepsko.|Zrób użytek ze zdobyczy współczesnej technologii.|Attack: Aktywuj
+04:36=Czasami z celowaniem u ciebie jest kiepsko.|Zrób użytek ze zdobyczy współczesnej technologii.|Atak: Aktywuj
 04:37=Nie bój się słońca. To potrwa tylko jedną turę,|ale pozwoli pochłonąć część obrażeń, które|zadałeś innym.|Atak: Aktywuj
 04:38=Karabin snajperski może stać się najbardziej niszczycielską|bronią w twoim arsenale. Jednakże jest bardzo nieskuteczny|na krótkie dystanse.| Im dalej od celu tym więcej HP zabierzesz.|Atak: Strzel (dwa strzały)
-04:39=Leć do innych części mapy uzywjąc spodka.|To ciężkie do opanowania narzędzie, może przenieść Ciebie|w prawie każdą pozycje na polu bitwy.|Atak: Aktywuj|Góra/Lewo/Prawo: Wyznacz lot w odpowiednim kierunku
+04:39=Leć do innych części mapy używając spodka.|To ciężkie do opanowania narzędzie, może przenieść Ciebie|w prawie każdą pozycje na polu bitwy.|Atak: Aktywuj|Góra/Lewo/Prawo: Wyznacz lot w odpowiednim kierunku
 04:40=Wznieć ogień używając koktajlu z łatwopalnym płynem.|Atak: Przytrzymaj by rzucić z większą siłą
-04:41=Natura może być na równi z technologią!|Ptaszek uniesie Ciebie ponad ziemię oraz|zrzuci jajka w przeciwników|Atak: Atywacja ptaka i zrzucanie jajek|Góra/Lewo/Prawo: Leć w wybranym kierunku
+04:41=Natura może być na równi z technologią!|Ptaszek uniesie Ciebie ponad ziemię oraz|zrzuci jajka w przeciwników|Atak: Aktywacja ptaka i zrzucanie jajek|Góra/Lewo/Prawo: Leć w wybranym kierunku
 04:42=To urządzenie umożliwia natychmiastowe|przetransportowanie Ciebie, Twoich|wrogów bądź uzbrojenia pomiędzy dwoma|miejscami na mapie|Użyj tego z głową a Twoja|misja zakończy się... WIELKIM SUKCESEM|Atak: Wystrzel portal|Zmiana (Tab): Zmień kolor portalu
 04:43=Niech twój debiut będzie WYBUCHOWY!|Zrzuć pianino z nieba, ale uważaj!|Ktoś musi na nim grać więc prawdopodobnie będziesz|musiał poświęcić swojego jeża|Kursor: Wybierz cel|F1-F9: Graj na pianinie
 04:44=To nie jest zwykły ser. To broń biologiczna!|Wybuch z pewnością nie będzie potężny, ale gdy|licznik dojdzie do zera, chmura gazu zatruje|każdego nieszczęśnika który będzie w pobliżu|1-5: Ustawia zapalnik|Atak: Przytrzymaj by rzucić z większą siłą
@@ -592,11 +592,11 @@
 04:48=Czyż walenie jeży po głowach nie|jest zabawne? Dobre uderzenie|z młotka zabierze 1/3 życia|przeciwnika i wkopie go w podłoże|Atak: Uderz
 04:49=Wskrześ swoich przyjaciół!|Jednakże uważaj byś nie pomógł swojemu wrogowi.|Atak: Przytrzymaj by powoli przywracać życie|Góra: Przyspiesz wskrzeszanie
 04:50=Wezwij szwadron śmiercionośnych wierteł|by wykurzyć kogoś z kryjówki. Po użyciu|zostanie zrzuconych 6 wiertniczych bomb|wkręcających się w podłoże|Lewo/Prawo: Określ kierunek ataku|Kursor: Wybierz miejsce zrzutu
-04:51=Obrzuć kogoś błotem! Broń ta nie zadaje dużych|obrażeń ale może gogoś zepchnąć z krawędzi!|Atak: Przytrzymaj by strzelić z większą siłą
+04:51=Obrzuć kogoś błotem! Broń ta nie zadaje dużych|obrażeń ale może Gogol zepchnąć z krawędzi!|Atak: Przytrzymaj by strzelić z większą siłą
 04:52=UNUSED
-04:53=Wybierz się na podróż w czasie i przestrzeni|zostawiając innne jeże na polu walki.|Bądź przygotowany na powrót w dowolnym momencie.|Gdy rozpocznie się|Nagła Śmierć lub większość jeży zostanie wybita.|Uwaga. Nie zadziała podczas Nagłej Śmierci,|gdy jesteś sam, lub jeśli jesteś Królem.
+04:53=Wybierz się na podróż w czasie i przestrzeni|zostawiając inne jeże na polu walki.|Bądź przygotowany na powrót w dowolnym momencie.|Gdy rozpocznie się|Nagła Śmierć lub większość jeży zostanie wybita.|Uwaga. Nie zadziała podczas Nagłej Śmierci,|gdy jesteś sam lub jeśli jesteś Królem.
 04:54=INCOMPLETE                                                                                                                                     
-04:55=Wystrzel strumień kleistej mazi.|Buduj mosty, zasypuj wrogów, ztykaj tunele.|Uważaj by nie zasypać samego siebie!
+04:55=Wystrzel strumień kleistej mazi.|Buduj mosty, zasypuj wrogów, zatykaj tunele.|Uważaj by nie zasypać samego siebie!
 
 ; Game goal strings
 05:00=Ustawienia gry
@@ -606,7 +606,7 @@
 05:04=Niezniszczalność: Jeże są (prawie) niezniszczalne
 05:05=Wampiryzm: Jeże dostają życie za zadane obrażenia
 05:06=Karma: Jeże doznają obrażeń za uszkodzenia zadane innym
-05:07=Broń Króla: Nie pozwój królowi umrzeć!|Umieść Króla: Wybierz pozycję startową dla króla
+05:07=Broń Króla: Nie pozwól królowi umrzeć!|Umieść Króla: Wybierz pozycję startową dla króla
 05:08=Umieść jeże: Umieść jeże przed rozpoczęciem gry.
 05:09=Artyleria: Jeże nie mogą się poruszać
 05:10=Niezniszczalny teren: Większość broni nie niszczy terenu.
--- a/share/hedgewars/Data/Locale/pt_PT.lua	Thu Nov 24 13:44:30 2011 +0100
+++ b/share/hedgewars/Data/Locale/pt_PT.lua	Thu Nov 24 16:18:45 2011 +0100
@@ -189,7 +189,7 @@
 --      ["Time Extended!"] = "",
 --      ["Time Extension"] = "",
 	["TIME: "] = "TEMPO: ",
---      ["Toggle Shield"] = "",
+	["Toggle Shield"] = "Ligar\Desligar Escudo",
 --      ["Toxic Team"] = "", -- User_Mission_-_Diver, User_Mission_-_Spooky_Tree, User_Mission_-_Teamwork
 --      ["TRACK COMPLETED"] = "PISTA COMPLETA",
 --      ["TRACK FAILED!"] = "PISTA",
@@ -197,11 +197,11 @@
 	["T_T"] = "T_T",
 --      ["Tumbling Time Extended!"] = "",
 --      ["Turn Time"] = "",
---      ["Unit"] = "",
+	["Unit"] = "Unidade",
 	["Unit 3378"] = "Unidade 3378",
---      ["Unit 835"] = "",
+	["Unit 835"] = "Unidade 835",
 	["Unlimited Attacks"] = "Ataques Ilimitados",
---      ["Unstoppable!"] = "",
+	["Unstoppable!"] = "Imparável!",
 --      ["User Challenge"] = "",
 	["Use your rope to get from start to finish as fast as you can!"] = "Utilizando a corda, percorre o percurso do inicio ao fim o mais rápido que conseguires!",
 --      ["Victory for the "] = "", -- CTF_Blizzard, Capture_the_Flag
@@ -211,8 +211,8 @@
 --      ["Weapons Reset"] = "",
 	["Well done."] = "Bom trabalho.",
 --      ["Will this ever end?"] = "",
---      ["WINNING TIME: "] = "",
---      ["You'd almost swear the water was rising!"] = "",
+	["WINNING TIME: "] = "TEMPO VENCEDOR: ",
+	["You'd almost swear the water was rising!"] = "Quase eras capaz jurar que a água estava a subir!",
 	["You have SCORED!!"] = "Marcaste!!",
 --      ["You saved"] = "",
 	["You've failed. Try again."] = "Falhaste. Tenta novamente.",
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Scripts/Multiplayer/Highlander.lua	Thu Nov 24 16:18:45 2011 +0100
@@ -0,0 +1,230 @@
+--------------------------------
+-- HIGHLANDER / HOGS OF WAR
+-- version 0.3b
+-- by mikade
+--------------------------------
+
+-----------
+--0.1
+-----------
+
+-- concept test
+
+-----------
+--0.2
+-----------
+
+-- remove tardis till Henek fixes his tracker
+-- change wep crates to health crates
+-- reset arb turntimevalue
+-- include randomOrder
+-- Until fixed .17 methods come out, remove switches and resurrector
+-- on request, removed kamikaze and piano weapons
+-- provisional fixing of bugs that can't actually be fixed yet
+
+-----------
+--0.3
+-----------
+
+-- meh, update incorrect display
+-- may change this in the future to have switches
+-- but for now people are used to it without, so~
+
+-- mudball is now counted as a utility
+
+-----------
+--0.3b
+-----------
+
+-- cleaned up code and got rid of unneccessary vars
+-- mudball is a weapon again
+-- landgun is now a utility
+-- extra time, vampirism utility removed
+-- hammer wep removed
+-- all hogs have kamikaze
+
+loadfile(GetDataPath() .. "Scripts/Locale.lua")()
+loadfile(GetDataPath() .. "Scripts/Tracker.lua")()
+
+local wepArray = {}
+local atkArray = {}
+local utilArray = {}
+
+local currName
+local lastName
+local started = false
+local switchStage = 0
+
+function StartingSetUp(gear)
+
+	for i = 1, #wepArray do	
+		setGearValue(gear,wepArray[i],0)
+	end
+
+	setGearValue(gear,amKamikaze,1)
+
+	i = 1 + GetRandom(#atkArray)
+	setGearValue(gear,atkArray[i],1)
+
+	i = 1 + GetRandom(#utilArray)
+	setGearValue(gear,utilArray[i],1)
+
+	SetHealth(gear, 100)
+
+end
+
+--[[function SaveWeapons(gear)
+
+	-
+	for i = 1, (#wepArray) do
+		setGearValue(gear, wepArray[i], GetAmmoCount(gear, wepArray[i]) )
+		 --AddAmmo(gear, wepArray[i], getGearValue(gear,wepArray[i]) )
+	end
+
+end]]
+
+function ConvertValues(gear)
+
+	for i = 1, #wepArray do	
+		AddAmmo(gear, wepArray[i], getGearValue(gear,wepArray[i]) )
+	end
+
+
+end
+
+
+function TransferWeps(gear)
+
+	if CurrentHedgehog ~= nil then
+
+		for i = 1, #wepArray do		
+			val = getGearValue(gear,wepArray[i])
+			if val ~= 0 then
+				setGearValue(CurrentHedgehog, wepArray[i], val)
+				AddAmmo(CurrentHedgehog, wepArray[i], val)
+			end
+		end
+
+	end
+
+end
+
+
+
+function onGameInit()
+	GameFlags = gfInfAttack + gfRandomOrder
+	HealthCaseProb = 100
+end
+
+function onGameStart()
+
+
+	ShowMission	(
+				loc("HIGHLANDER"),
+				loc("Not all hogs are born equal."),
+
+				"- " .. loc("Eliminate enemy hogs and take their weapons.") .. "|" ..
+				"- " .. loc("Per-Hog Ammo") .. "|" ..
+				"- " .. loc("Weapons reset.") .. "|" ..
+				"- " .. loc("Unlimited Attacks") .. "|" ..
+				"", 4, 4000
+				)
+
+	atkArray = 	{amBazooka, amBee, amMortar, amDrill, --[[amSnowball,]]
+			amGrenade, amClusterBomb, amMolotov, amWatermelon, amHellishBomb, amGasBomb,
+			amShotgun, amDEagle, amFlamethrower, amSniperRifle, amSineGun,
+			amFirePunch, amWhip, amBaseballBat, --[[amKamikaze,]] amSeduction, --[[amHammer,]]
+			amMine, amDynamite, amCake, amBallgun, amRCPlane, amSMine,
+			amAirAttack, amMineStrike, amDrillStrike, --[[amPiano,]] amRCPlane, amSMine,
+			amBirdy
+
+			} 
+
+	utilArray = 	{amBlowTorch, amPickHammer, amGirder, amPortalGun,
+			amRope, amParachute, amTeleport, amJetpack,
+			amInvulnerable, amLaserSight, --[[amVampiric,]]
+			amLowGravity, amExtraDamage, --[[amExtraTime,]]
+			amLandGun
+			}
+
+	wepArray = 	{amBazooka, amBee, amMortar, amDrill, --[[amSnowball,]]
+			amGrenade, amClusterBomb, amMolotov, amWatermelon, amHellishBomb, amGasBomb,
+			amShotgun, amDEagle, amFlamethrower, amSniperRifle, amSineGun,
+			amFirePunch, amWhip, amBaseballBat, --[[amKamikaze,]] amSeduction, --[[amHammer,]]
+			amMine, amDynamite, amCake, amBallgun, amRCPlane, amSMine,
+			amAirAttack, amMineStrike, amDrillStrike, --[[amPiano,]] amRCPlane, amSMine,
+			amBirdy,
+			
+			amBlowTorch, amPickHammer, amGirder, amPortalGun,
+			amRope, amParachute, amTeleport, amJetpack,
+			amInvulnerable, amLaserSight, --[[amVampiric,]]
+			amLowGravity, amExtraDamage, --[[amExtraTime,]]
+			amLandGun
+
+			}
+
+	-- REMOVED
+	-- amTardis, amResurrector, amSwitch 
+
+	runOnGears(StartingSetUp)
+	runOnGears(ConvertValues)
+
+
+end
+
+function onNewTurn()
+--
+end
+
+
+function onGameTick()
+
+	if (CurrentHedgehog ~= nil) then
+
+		currName = GetHogName(CurrentHedgehog)
+
+		if (currName ~= lastName) then
+			AddCaption(loc("Switched to ") .. currName .. "!")
+			ConvertValues(CurrentHedgehog)
+		end
+
+		lastName = currName
+	end
+
+end
+
+--[[function onHogHide(gear)
+	-- waiting for Henek
+end
+
+function onHogRestore(gear)
+	-- waiting for Henek
+end]]
+
+function onGearAdd(gear)
+
+	--if GetGearType(gear) == gtSwitcher then
+	--	SaveWeapons(CurrentHedgehog)
+	--end
+
+	if (GetGearType(gear) == gtHedgehog) then
+		trackGear(gear)
+	end
+
+end
+
+function onGearDelete(gear)
+
+	if (GetGearType(gear) == gtHedgehog) then --or (GetGearType(gear) == gtResurrector) then
+		TransferWeps(gear)
+		trackDeletion(gear)
+	end
+
+end
+
+function onAmmoStoreInit()
+	SetAmmo(amSkip, 9, 0, 0, 0)
+	SetAmmo(amKamikaze, 9, 0, 0, 0)
+	--SetAmmo(amSwitch, 9, 0, 0, 0) -------1
+end
+
--- a/share/hedgewars/Data/Themes/Eyes/theme.cfg	Thu Nov 24 13:44:30 2011 +0100
+++ b/share/hedgewars/Data/Themes/Eyes/theme.cfg	Thu Nov 24 16:18:45 2011 +0100
@@ -7,3 +7,4 @@
 clouds = 9
 flakes = 50, 1, 1000, 50, 50
 ;1, 1000, 50, 50 are copied from bamboo theme, as these numbers are required
+flatten-flakes = yes
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/PascalBasics.hs	Thu Nov 24 16:18:45 2011 +0100
@@ -0,0 +1,70 @@
+{-# LANGUAGE FlexibleContexts #-}
+module PascalBasics where
+
+import Text.Parsec.Combinator
+import Text.Parsec.Char
+import Text.Parsec.Prim
+import Text.Parsec.Token
+import Text.Parsec.Language
+import Data.Char
+
+builtin = ["succ", "pred", "low", "high"]
+    
+pascalLanguageDef
+    = emptyDef
+    { commentStart   = "(*"
+    , commentEnd     = "*)"
+    , commentLine    = "//"
+    , nestedComments = False
+    , identStart     = letter <|> oneOf "_"
+    , identLetter    = alphaNum <|> oneOf "_."
+    , reservedNames  = [
+            "begin", "end", "program", "unit", "interface"
+            , "implementation", "and", "or", "xor", "shl"
+            , "shr", "while", "do", "repeat", "until", "case", "of"
+            , "type", "var", "const", "out", "array", "packed"
+            , "procedure", "function", "with", "for", "to"
+            , "downto", "div", "mod", "record", "set", "nil"
+            , "string", "shortstring"
+            ] ++ builtin
+    , reservedOpNames= [] 
+    , caseSensitive  = False   
+    }
+
+preprocessorSwitch :: Stream s m Char => ParsecT s u m String
+preprocessorSwitch = do
+    try $ string "{$"
+    s <- manyTill (noneOf "\n") $ char '}'
+    return s
+        
+caseInsensitiveString s = do
+    mapM_ (\a -> satisfy (\b -> toUpper a == toUpper b)) s <?> s
+    return s
+    
+pas = patch $ makeTokenParser pascalLanguageDef
+    where
+    patch tp = tp {stringLiteral = stringL}
+
+comment = choice [
+        char '{' >> notFollowedBy (char '$') >> manyTill anyChar (try $ char '}')
+        , (try $ string "(*") >> manyTill anyChar (try $ string "*)")
+        , (try $ string "//") >> manyTill anyChar (try newline)
+        ]
+    
+comments = do
+    spaces
+    skipMany $ do
+        preprocessorSwitch <|> comment
+        spaces
+
+stringL = do
+    (char '\'')
+    s <- (many $ noneOf "'")
+    (char '\'')
+    ss <- many $ do
+        (char '\'')
+        s' <- (many $ noneOf "'")
+        (char '\'')
+        return $ '\'' : s'
+    comments    
+    return $ concat (s:ss)
--- a/tools/PascalParser.hs	Thu Nov 24 13:44:30 2011 +0100
+++ b/tools/PascalParser.hs	Thu Nov 24 16:18:45 2011 +0100
@@ -1,14 +1,17 @@
 module PascalParser where
 
-import Text.Parsec.Expr
+import Text.Parsec
 import Text.Parsec.Char
 import Text.Parsec.Token
 import Text.Parsec.Language
+import Text.Parsec.Expr
 import Text.Parsec.Prim
 import Text.Parsec.Combinator
 import Text.Parsec.String
 import Control.Monad
-import Data.Char
+import Data.Maybe
+
+import PascalBasics
 
 data PascalUnit =
     Program Identifier Implementation
@@ -23,8 +26,8 @@
 data TypesAndVars = TypesAndVars [TypeVarDeclaration]
     deriving Show
 data TypeVarDeclaration = TypeDeclaration Identifier TypeDecl
-    | VarDeclaration Bool ([Identifier], TypeDecl) (Maybe Expression)
-    | FunctionDeclaration Identifier TypeDecl (Maybe Phrase)
+    | VarDeclaration Bool ([Identifier], TypeDecl) (Maybe InitExpression)
+    | FunctionDeclaration Identifier TypeDecl (Maybe (TypesAndVars,Phrase))
     deriving Show
 data TypeDecl = SimpleType Identifier
     | RangeType Range
@@ -32,11 +35,11 @@
     | ArrayDecl Range TypeDecl
     | RecordType [TypeVarDeclaration]
     | PointerTo TypeDecl
-    | String
+    | String Integer
     | UnknownType
     deriving Show
 data Range = Range Identifier
-           | RangeFromTo Expression Expression
+           | RangeFromTo InitExpression InitExpression
     deriving Show
 data Initialize = Initialize String
     deriving Show
@@ -49,18 +52,20 @@
         | WhileCycle Expression Phrase
         | RepeatCycle Expression [Phrase]
         | ForCycle Identifier Expression Expression Phrase
-        | WithBlock Expression Phrase
+        | WithBlock Reference Phrase
         | Phrases [Phrase]
         | SwitchCase Expression [(Expression, Phrase)] (Maybe Phrase)
         | Assignment Reference Expression
     deriving Show
 data Expression = Expression String
+    | BuiltInFunCall [Expression] Reference
     | PrefixOp String Expression
     | PostfixOp String Expression
     | BinOp String Expression Expression
     | StringLiteral String
     | CharCode String
     | NumberLiteral String
+    | FloatLiteral String
     | HexNumber String
     | Reference Reference
     | Null
@@ -72,48 +77,20 @@
     | RecordField Reference Reference
     | Address Reference
     deriving Show
-    
-pascalLanguageDef
-    = emptyDef
-    { commentStart   = "(*"
-    , commentEnd     = "*)"
-    , commentLine    = "//"
-    , nestedComments = False
-    , identStart     = letter <|> oneOf "_"
-    , identLetter    = alphaNum <|> oneOf "_."
-    , reservedNames  = [
-            "begin", "end", "program", "unit", "interface"
-            , "implementation", "and", "or", "xor", "shl"
-            , "shr", "while", "do", "repeat", "until", "case", "of"
-            , "type", "var", "const", "out", "array", "packed"
-            , "procedure", "function", "with", "for", "to"
-            , "downto", "div", "mod", "record", "set", "nil"
-            , "string", "shortstring"
-            ]
-    , reservedOpNames= [] 
-    , caseSensitive  = False   
-    }
-    
-pas = patch $ makeTokenParser pascalLanguageDef
-    where
-    patch tp = tp {stringLiteral = sl}
-    sl = do
-        (char '\'')
-        s <- (many $ noneOf "'")
-        (char '\'')
-        ss <- many $ do
-            (char '\'')
-            s' <- (many $ noneOf "'")
-            (char '\'')
-            return $ '\'' : s'
-        comments    
-        return $ concat (s:ss)
-    
-comments = do
-    spaces
-    skipMany $ do
-        comment
-        spaces
+data InitExpression = InitBinOp String InitExpression InitExpression
+    | InitPrefixOp String InitExpression
+    | InitReference Identifier
+    | InitArray [InitExpression]
+    | InitRecord [(Identifier, InitExpression)]
+    | InitFloat String
+    | InitNumber String
+    | InitHexNumber String
+    | InitString String
+    | InitChar String
+    | BuiltInFunction String [InitExpression]
+    | InitSet [Identifier]
+    | InitNull
+    deriving Show
 
 pascalUnit = do
     comments
@@ -121,12 +98,6 @@
     comments
     return u
 
-comment = choice [
-        char '{' >> manyTill anyChar (try $ char '}')
-        , (try $ string "(*") >> manyTill anyChar (try $ string "*)")
-        , (try $ string "//") >> manyTill anyChar (try newline)
-        ]
-
 iD = do
     i <- liftM Identifier (identifier pas)
     comments
@@ -146,17 +117,22 @@
 reference = buildExpressionParser table term <?> "reference"
     where
     term = comments >> choice [
-        parens pas reference 
-        , char '@' >> reference >>= return . Address
-        , iD >>= return . SimpleReference
+        parens pas (reference >>= postfixes) >>= postfixes
+        , char '@' >> reference >>= postfixes >>= return . Address
+        , liftM SimpleReference iD >>= postfixes 
         ] <?> "simple reference"
 
     table = [ 
-            [Postfix $ (parens pas) (option [] parameters) >>= return . FunCall]
-          , [Postfix (char '^' >> return Dereference)]
-          , [Postfix $ (brackets pas) (commaSep1 pas $ expression) >>= return . ArrayElement]
-          , [Infix (try (char '.' >> notFollowedBy (char '.')) >> return RecordField) AssocLeft]
+            [Infix (try (char '.' >> notFollowedBy (char '.')) >> return RecordField) AssocLeft]
         ]
+    
+    postfixes r = many postfix >>= return . foldl fp r
+    postfix = choice [
+            parens pas (option [] parameters) >>= return . FunCall
+          , char '^' >> return Dereference
+          , (brackets pas) (commaSep1 pas $ expression) >>= return . ArrayElement
+        ]
+    fp r f = f r
 
     
 varsDecl1 = varsParser sepEndBy1    
@@ -183,7 +159,7 @@
     init <- option Nothing $ do
         char '='
         comments
-        e <- expression
+        e <- initExpression
         comments
         return (Just e)
     return $ VarDeclaration False (ids, t) init
@@ -204,18 +180,19 @@
             return ()
         char '='
         comments
-        e <- expression
+        e <- initExpression
         comments
         return $ VarDeclaration False ([i], UnknownType) (Just e)
         
 typeDecl = choice [
     char '^' >> typeDecl >>= return . PointerTo
-    , try (string "shortstring") >> return String
+    , try (string "shortstring") >> return (String 255)
+    , try (string "string") >> optionMaybe (brackets pas $ integer pas) >>= return . String . fromMaybe 255
     , arrayDecl
     , recordDecl
+    , sequenceDecl >>= return . Sequence
+    , try (identifier pas) >>= return . SimpleType . Identifier
     , rangeDecl >>= return . RangeType
-    , sequenceDecl >>= return . Sequence
-    , identifier pas >>= return . SimpleType . Identifier
     ] <?> "type declaration"
     where
     arrayDecl = do
@@ -259,9 +236,9 @@
     ] <?> "range declaration"
     where
     rangeft = do
-    e1 <- expression
+    e1 <- initExpression
     string ".."
-    e2 <- expression
+    e2 <- initExpression
     return $ RangeFromTo e1 e2
     
 typeVarDeclaration isImpl = (liftM concat . many . choice) [
@@ -297,17 +274,11 @@
         try $ string "procedure"
         comments
         i <- iD
-        optional $ do
-            char '('
-            varsDecl False
-            char ')'
+        optional $ parens pas $ varsDecl False
         comments
         char ';'
+        comments
         b <- if isImpl then
-                do
-                comments
-                optional $ typeVarDeclaration True
-                comments
                 liftM Just functionBody
                 else
                 return Nothing
@@ -318,10 +289,7 @@
         try $ string "function"
         comments
         i <- iD
-        optional $ do
-            char '('
-            varsDecl False
-            char ')'
+        optional $ parens pas $ varsDecl False
         comments
         char ':'
         comments
@@ -330,13 +298,10 @@
         char ';'
         comments
         b <- if isImpl then
-                do
-                optional $ typeVarDeclaration True
-                comments
                 liftM Just functionBody
                 else
                 return Nothing
-        return $ [FunctionDeclaration i ret Nothing]
+        return $ [FunctionDeclaration i ret b]
 
 program = do
     string "program"
@@ -370,11 +335,15 @@
 expression = buildExpressionParser table term <?> "expression"
     where
     term = comments >> choice [
-        parens pas $ expression 
-        , try $ integer pas >>= return . NumberLiteral . show
+        builtInFunction expression >>= \(n, e) -> return $ BuiltInFunCall e (SimpleReference (Identifier n))
+        , parens pas $ expression 
+        , try $ natural pas >>= \i -> notFollowedBy (char '.') >> (return . NumberLiteral . show) i
+        , try $ float pas >>= return . FloatLiteral . show
+        , try $ natural pas >>= return . NumberLiteral . show
         , stringLiteral pas >>= return . StringLiteral
         , char '#' >> many digit >>= return . CharCode
         , char '$' >> many hexDigit >>= return . HexNumber
+        , char '-' >> expression >>= return . PrefixOp "-"
         , try $ string "nil" >> return Null
         , reference >>= return . Reference
         ] <?> "simple expression"
@@ -387,7 +356,6 @@
           ]
         , [  Infix (char '+' >> return (BinOp "+")) AssocLeft
            , Infix (char '-' >> return (BinOp "-")) AssocLeft
-           , Prefix (char '-' >> return (PrefixOp "-"))
           ]
         , [  Infix (try (string "<>") >> return (BinOp "<>")) AssocNone
            , Infix (try (string "<=") >> return (BinOp "<=")) AssocNone
@@ -400,8 +368,8 @@
            , Infix (try $ string "or" >> return (BinOp "or")) AssocLeft
            , Infix (try $ string "xor" >> return (BinOp "xor")) AssocLeft
           ]
-        , [  Infix (try $ string "shl" >> return (BinOp "and")) AssocNone
-           , Infix (try $ string "shr" >> return (BinOp "or")) AssocNone
+        , [  Infix (try $ string "shl" >> return (BinOp "shl")) AssocNone
+           , Infix (try $ string "shr" >> return (BinOp "shr")) AssocNone
           ]
         , [Prefix (try (string "not") >> return (PrefixOp "not"))]
         ]
@@ -459,12 +427,12 @@
 withBlock = do
     try $ string "with"
     comments
-    e <- expression
+    rs <- (commaSep1 pas) reference
     comments
     string "do"
     comments
     o <- phrase
-    return $ WithBlock e o
+    return $ foldr WithBlock o rs
     
 repeatCycle = do
     try $ string "repeat"
@@ -510,6 +478,7 @@
         comments
         return o
     string "end"
+    comments
     return $ SwitchCase e cs o2
     where
     aCase = do
@@ -529,10 +498,12 @@
 parameters = (commaSep pas) expression <?> "parameters"
         
 functionBody = do
+    tv <- typeVarDeclaration True
+    comments
     p <- phrasesBlock
     char ';'
     comments
-    return p
+    return (TypesAndVars tv, p)
 
 uses = liftM Uses (option [] u)
     where
@@ -543,3 +514,63 @@
             char ';'
             comments
             return u
+
+initExpression = buildExpressionParser table term <?> "initialization expression"
+    where
+    term = comments >> choice [
+        liftM (uncurry BuiltInFunction) $ builtInFunction initExpression 
+        , try $ brackets pas (commaSep pas $ iD) >>= return . InitSet
+        , try $ parens pas (commaSep pas $ initExpression) >>= return . InitArray
+        , parens pas (semiSep pas $ recField) >>= return . InitRecord
+        , try $ integer pas >>= \i -> notFollowedBy (char '.') >> (return . InitNumber . show) i
+        , try $ float pas >>= return . InitFloat . show
+        , try $ integer pas >>= return . InitNumber . show
+        , stringLiteral pas >>= return . InitString
+        , char '#' >> many digit >>= return . InitChar
+        , char '$' >> many hexDigit >>= return . InitHexNumber
+        , try $ string "nil" >> return InitNull
+        , iD >>= return . InitReference
+        ]
+        
+    recField = do
+        i <- iD
+        spaces
+        char ':'
+        spaces
+        e <- initExpression
+        spaces
+        return (i ,e)
+
+    table = [ 
+          [  Infix (char '*' >> return (InitBinOp "*")) AssocLeft
+           , Infix (char '/' >> return (InitBinOp "/")) AssocLeft
+           , Infix (try (string "div") >> return (InitBinOp "div")) AssocLeft
+           , Infix (try (string "mod") >> return (InitBinOp "mod")) AssocLeft
+          ]
+        , [  Infix (char '+' >> return (InitBinOp "+")) AssocLeft
+           , Infix (char '-' >> return (InitBinOp "-")) AssocLeft
+           , Prefix (char '-' >> return (InitPrefixOp "-"))
+          ]
+        , [  Infix (try (string "<>") >> return (InitBinOp "<>")) AssocNone
+           , Infix (try (string "<=") >> return (InitBinOp "<=")) AssocNone
+           , Infix (try (string ">=") >> return (InitBinOp ">=")) AssocNone
+           , Infix (char '<' >> return (InitBinOp "<")) AssocNone
+           , Infix (char '>' >> return (InitBinOp ">")) AssocNone
+           , Infix (char '=' >> return (InitBinOp "=")) AssocNone
+          ]
+        , [  Infix (try $ string "and" >> return (InitBinOp "and")) AssocLeft
+           , Infix (try $ string "or" >> return (InitBinOp "or")) AssocLeft
+           , Infix (try $ string "xor" >> return (InitBinOp "xor")) AssocLeft
+          ]
+        , [  Infix (try $ string "shl" >> return (InitBinOp "and")) AssocNone
+           , Infix (try $ string "shr" >> return (InitBinOp "or")) AssocNone
+          ]
+        , [Prefix (try (string "not") >> return (InitPrefixOp "not"))]
+        ]
+
+builtInFunction e = do
+    name <- choice $ map (\s -> try $ caseInsensitiveString s >>= \i -> notFollowedBy alphaNum >> return i) builtin
+    spaces
+    exprs <- parens pas $ commaSep1 pas $ e
+    spaces
+    return (name, exprs)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tools/PascalPreprocessor.hs	Thu Nov 24 16:18:45 2011 +0100
@@ -0,0 +1,117 @@
+module PascalPreprocessor where
+
+import Text.Parsec
+import Control.Monad.IO.Class
+import Control.Monad
+import System.IO
+import qualified Data.Map as Map
+import Data.Char
+
+
+-- comments are removed
+comment = choice [
+        char '{' >> notFollowedBy (char '$') >> manyTill anyChar (try $ char '}') >> return ""
+        , (try $ string "(*") >> manyTill anyChar (try $ string "*)") >> return ""
+        , (try $ string "//") >> manyTill anyChar (try newline) >> return "\n"
+        ]
+
+preprocess :: String -> IO String
+preprocess fn = do
+    r <- runParserT (preprocessFile fn) (Map.empty, [True]) "" ""
+    case r of
+         (Left a) -> do
+             hPutStrLn stderr (show a)
+             return ""
+         (Right a) -> return a
+    
+    where
+    preprocessFile fn = do
+        f <- liftIO (readFile fn)
+        setInput f
+        preprocessor
+        
+    preprocessor, codeBlock, switch :: ParsecT String (Map.Map String String, [Bool]) IO String
+    
+    preprocessor = chainr codeBlock (return (++)) ""
+    
+    codeBlock = do
+        s <- choice [
+            switch
+            , comment
+            , char '\'' >> many (noneOf "'\n") >>= \s -> char '\'' >> return ('\'' : s ++ "'")
+            , identifier >>= replace
+            , noneOf "{" >>= \a -> return [a]
+            ]
+        (_, ok) <- getState
+        return $ if and ok then s else ""
+
+    --otherChar c = c `notElem` "{/('_" && not (isAlphaNum c)
+    identifier = do
+        c <- letter <|> oneOf "_"
+        s <- many (alphaNum <|> oneOf "_")
+        return $ c:s
+            
+    switch = do
+        try $ string "{$"
+        s <- choice [
+            include
+            , ifdef
+            , elseSwitch
+            , endIf
+            , define
+            , unknown
+            ]
+        return s
+        
+    include = do
+        try $ string "INCLUDE"
+        spaces
+        (char '"')
+        fn <- many1 $ noneOf "\"\n"
+        char '"'
+        spaces
+        char '}'
+        f <- liftIO (readFile fn)
+        c <- getInput
+        setInput $ f ++ c
+        return ""
+
+    ifdef = do
+        s <- try (string "IFDEF") <|> try (string "IFNDEF")
+        let f = if s == "IFNDEF" then not else id
+        
+        spaces
+        d <- many1 alphaNum
+        spaces
+        char '}'
+        
+        updateState $ \(m, b) ->
+            (m, (f $ d `Map.member` m) : b)
+        
+      
+        return ""
+        
+    elseSwitch = do
+        try $ string "ELSE}"
+        updateState $ \(m, b:bs) -> (m, (not b):bs)
+        return ""
+    endIf = do
+        try $ string "ENDIF}"
+        updateState $ \(m, b:bs) -> (m, bs)
+        return ""
+    define = do
+        try $ string "DEFINE"
+        spaces
+        i <- identifier        
+        d <- option "" (string ":=" >> many (noneOf "}"))
+        char '}'
+        updateState $ \(m, b) -> (if and b then Map.insert i d m else m, b)
+        return ""
+    replace s = do
+        (m, _) <- getState
+        return $ Map.findWithDefault s s m
+        
+    unknown = do
+        fn <- many1 $ noneOf "}\n"
+        char '}'
+        return $ "{$" ++ fn ++ "}"
--- a/tools/pas2c.hs	Thu Nov 24 13:44:30 2011 +0100
+++ b/tools/pas2c.hs	Thu Nov 24 16:18:45 2011 +0100
@@ -4,11 +4,24 @@
 import Text.PrettyPrint.HughesPJ
 import Data.Maybe
 import Data.Char
+import Text.Parsec.String
 
 
+pas2C :: String -> IO String
+pas2C fileName = do
+    ptree <- parseFromFile pascalUnit fileName
+    case ptree of
+         (Left a) -> return (show a)
+         (Right a) -> (return . render . pascal2C) a
+
 pascal2C :: PascalUnit -> Doc
-pascal2C (Unit unitName interface implementation init fin) = implementation2C implementation
+pascal2C (Unit unitName interface implementation init fin) = 
+    interface2C interface
+    $+$ 
+    implementation2C implementation
 
+interface2C :: Interface -> Doc
+interface2C (Interface uses tvars) = typesAndVars2C tvars
 
 implementation2C :: Implementation -> Doc
 implementation2C (Implementation uses tvars) = typesAndVars2C tvars
@@ -21,17 +34,50 @@
 tvar2C :: TypeVarDeclaration -> Doc
 tvar2C (FunctionDeclaration (Identifier name) returnType Nothing) = 
     type2C returnType <+> text (name ++ "();")
-
-    
-tvar2C (FunctionDeclaration (Identifier name) returnType (Just phrase)) = 
+tvar2C (FunctionDeclaration (Identifier name) returnType (Just (tvars, phrase))) = 
     type2C returnType <+> text (name ++ "()") 
     $$
+    text "{" $+$ (nest 4 $ typesAndVars2C tvars)
+    $+$
     phrase2C phrase
-tvar2C _ = empty
+    $+$ 
+    text "}"
+tvar2C (TypeDeclaration (Identifier i) t) = text "type" <+> text i <+> type2C t <> text ";"
+tvar2C (VarDeclaration isConst (ids, t) mInitExpr) = 
+    if isConst then text "const" else empty
+    <+>
+    type2C t
+    <+>
+    (hsep . punctuate (char ',') . map (\(Identifier i) -> text i) $ ids)
+    <+>
+    initExpr mInitExpr
+    <>
+    text ";"
+    where
+    initExpr Nothing = empty
+    initExpr (Just e) = text "=" <+> initExpr2C e
+
+initExpr2C :: InitExpression -> Doc
+initExpr2C (InitBinOp op expr1 expr2) = parens $ (initExpr2C expr1) <+> op2C op <+> (initExpr2C expr2)
+initExpr2C (InitNumber s) = text s
+initExpr2C (InitFloat s) = text s
+initExpr2C (InitHexNumber s) = text "0x" <> (text . map toLower $ s)
+initExpr2C (InitString s) = doubleQuotes $ text s 
+initExpr2C (InitReference (Identifier i)) = text i
+
+
+initExpr2C _ = text "<<expression>>"
 
 type2C :: TypeDecl -> Doc
 type2C UnknownType = text "void"
-type2C _ = text "<<type>>"
+type2C (String l) = text $ "string" ++ show l
+type2C (SimpleType (Identifier i)) = text i
+type2C (PointerTo t) = type2C t <> text "*"
+type2C (RecordType tvs) = text "{" $+$ (nest 4 . vcat . map tvar2C $ tvs) $+$ text "}"
+type2C (RangeType r) = text "<<range type>>"
+type2C (Sequence ids) = text "<<sequence type>>"
+type2C (ArrayDecl r t) = text "<<array type>>"
+
 
 phrase2C :: Phrase -> Doc
 phrase2C (Phrases p) = text "{" $+$ (nest 4 . vcat . map phrase2C $ p) $+$ text "}"
@@ -46,15 +92,18 @@
     where
     case2C :: (Expression, Phrase) -> Doc
     case2C (e, p) = text "case" <+> parens (expr2C e) <> char ':' <> nest 4 (phrase2C p $+$ text "break;")
-{-
-        | RepeatCycle Expression Phrase
-        | ForCycle
-        -}
-phrase2C _ = empty
+phrase2C (WithBlock ref p) = text "namespace" <> parens (ref2C ref) $$ (phrase2C $ wrapPhrase p)
+phrase2C (ForCycle (Identifier i) e1 e2 p) = 
+    text "for" <> (parens . hsep . punctuate (char ';') $ [text i <+> text "=" <+> expr2C e1, text i <+> text "<=" <+> expr2C e2, text "++" <> text i])
+    $$
+    phrase2C (wrapPhrase p)
+phrase2C (RepeatCycle e p) = text "do" <+> phrase2C (Phrases p) <+> text "while" <> parens (text "!" <> parens (expr2C e))
+
 
 wrapPhrase p@(Phrases _) = p
 wrapPhrase p = Phrases [p]
 
+
 expr2C :: Expression -> Doc
 expr2C (Expression s) = text s
 expr2C (BinOp op expr1 expr2) = parens $ (expr2C expr1) <+> op2C op <+> (expr2C expr2)
@@ -79,6 +128,7 @@
 ref2C (FunCall params ref) = ref2C ref <> parens (hsep . punctuate (char ',') . map expr2C $ params)
 ref2C (Address ref) = text "&" <> ref2C ref
 
+
 op2C "or" = text "|"
 op2C "and" = text "&"
 op2C "not" = text "!"