merge with default spacecampaign
authorPeriklis Ntanasis <pntanasis@gmail.com>
Sat, 27 Jul 2013 17:23:26 +0300
branchspacecampaign
changeset 9382 f1464fa10c0b
parent 9346 1245c7636380 (diff)
parent 9380 563ab624522c (current diff)
child 9384 557ae509547b
merge with default
misc/libfreetype/Android.mk
misc/libfreetype/ChangeLog
misc/libfreetype/ChangeLog.20
misc/libfreetype/ChangeLog.21
misc/libfreetype/ChangeLog.22
misc/libfreetype/ChangeLog.23
misc/libfreetype/Jamfile
misc/libfreetype/Jamrules
misc/libfreetype/README
misc/libfreetype/README.git
misc/libfreetype/Xcode-iOS/Freetype.xcodeproj/default.mode1v3
misc/libfreetype/Xcode-iOS/Freetype.xcodeproj/default.pbxuser
misc/libfreetype/Xcode-iOS/Freetype.xcodeproj/project.pbxproj
misc/libfreetype/Xcode-iOS/Freetype_Prefix.pch
misc/libfreetype/Xcode/Freetype.xcodeproj/default.mode1v3
misc/libfreetype/Xcode/Freetype.xcodeproj/default.pbxuser
misc/libfreetype/Xcode/Freetype.xcodeproj/project.pbxproj
misc/libfreetype/Xcode/Freetype_Prefix.pch
misc/libfreetype/autogen.sh
misc/libfreetype/builds/amiga/include/freetype/config/ftconfig.h
misc/libfreetype/builds/amiga/include/freetype/config/ftmodule.h
misc/libfreetype/builds/amiga/makefile
misc/libfreetype/builds/amiga/makefile.os4
misc/libfreetype/builds/amiga/smakefile
misc/libfreetype/builds/amiga/src/base/ftdebug.c
misc/libfreetype/builds/amiga/src/base/ftsystem.c
misc/libfreetype/builds/atari/ATARI.H
misc/libfreetype/builds/atari/FNames.SIC
misc/libfreetype/builds/atari/FREETYPE.PRJ
misc/libfreetype/builds/atari/README.TXT
misc/libfreetype/builds/atari/deflinejoiner.awk
misc/libfreetype/builds/atari/gen-purec-patch.sh
misc/libfreetype/builds/mac/FreeType.m68k_cfm.make.txt
misc/libfreetype/builds/mac/FreeType.m68k_far.make.txt
misc/libfreetype/builds/mac/FreeType.ppc_carbon.make.txt
misc/libfreetype/builds/mac/FreeType.ppc_classic.make.txt
misc/libfreetype/builds/mac/ascii2mpw.py
misc/libfreetype/builds/mac/ftlib.prj.xml
misc/libfreetype/builds/mac/ftmac.c
misc/libfreetype/builds/newline
misc/libfreetype/builds/symbian/bld.inf
misc/libfreetype/builds/symbian/freetype.mmp
misc/libfreetype/builds/unix/configure.raw
misc/libfreetype/builds/unix/freetype-config.in
misc/libfreetype/builds/unix/freetype2.in
misc/libfreetype/builds/unix/freetype2.m4
misc/libfreetype/builds/unix/ft-munmap.m4
misc/libfreetype/builds/unix/ft2unix.h
misc/libfreetype/builds/unix/ftconfig.in
misc/libfreetype/builds/unix/ftsystem.c
misc/libfreetype/builds/unix/install-sh
misc/libfreetype/builds/unix/mkinstalldirs
misc/libfreetype/builds/unix/unix-cc.in
misc/libfreetype/builds/unix/unix-def.in
misc/libfreetype/builds/vms/ftconfig.h
misc/libfreetype/builds/vms/ftsystem.c
misc/libfreetype/builds/win32/ftdebug.c
misc/libfreetype/builds/win32/vc2005/freetype.sln
misc/libfreetype/builds/win32/vc2005/freetype.vcproj
misc/libfreetype/builds/win32/vc2005/index.html
misc/libfreetype/builds/win32/vc2008/freetype.sln
misc/libfreetype/builds/win32/vc2008/freetype.vcproj
misc/libfreetype/builds/win32/vc2008/index.html
misc/libfreetype/builds/win32/vc2010/freetype.sln
misc/libfreetype/builds/win32/vc2010/freetype.vcxproj
misc/libfreetype/builds/win32/vc2010/freetype.vcxproj.filters
misc/libfreetype/builds/win32/vc2010/index.html
misc/libfreetype/builds/win32/visualc/freetype.dsp
misc/libfreetype/builds/win32/visualc/freetype.dsw
misc/libfreetype/builds/win32/visualc/freetype.sln
misc/libfreetype/builds/win32/visualc/freetype.vcproj
misc/libfreetype/builds/win32/visualc/index.html
misc/libfreetype/builds/win32/visualce/freetype.dsp
misc/libfreetype/builds/win32/visualce/freetype.dsw
misc/libfreetype/builds/win32/visualce/freetype.vcproj
misc/libfreetype/builds/win32/visualce/index.html
misc/libfreetype/builds/wince/ftdebug.c
misc/libfreetype/builds/wince/vc2005-ce/freetype.sln
misc/libfreetype/builds/wince/vc2005-ce/freetype.vcproj
misc/libfreetype/builds/wince/vc2005-ce/index.html
misc/libfreetype/builds/wince/vc2008-ce/freetype.sln
misc/libfreetype/builds/wince/vc2008-ce/freetype.vcproj
misc/libfreetype/builds/wince/vc2008-ce/index.html
misc/libfreetype/configure
misc/libfreetype/devel/ft2build.h
misc/libfreetype/devel/ftoption.h
misc/libfreetype/docs/CHANGES
misc/libfreetype/docs/CUSTOMIZE
misc/libfreetype/docs/DEBUG
misc/libfreetype/docs/FTL.TXT
misc/libfreetype/docs/GPL.TXT
misc/libfreetype/docs/INSTALL
misc/libfreetype/docs/INSTALL.ANY
misc/libfreetype/docs/INSTALL.CROSS
misc/libfreetype/docs/INSTALL.GNU
misc/libfreetype/docs/INSTALL.MAC
misc/libfreetype/docs/INSTALL.UNIX
misc/libfreetype/docs/INSTALL.VMS
misc/libfreetype/docs/LICENSE.TXT
misc/libfreetype/docs/MAKEPP
misc/libfreetype/docs/PROBLEMS
misc/libfreetype/docs/TODO
misc/libfreetype/docs/UPGRADE.UNIX
misc/libfreetype/docs/VERSION.DLL
misc/libfreetype/docs/formats.txt
misc/libfreetype/docs/raster.txt
misc/libfreetype/docs/release
misc/libfreetype/include/freetype/config/ftconfig.h
misc/libfreetype/include/freetype/config/ftheader.h
misc/libfreetype/include/freetype/config/ftmodule.h
misc/libfreetype/include/freetype/config/ftoption.h
misc/libfreetype/include/freetype/config/ftstdlib.h
misc/libfreetype/include/freetype/freetype.h
misc/libfreetype/include/freetype/ftadvanc.h
misc/libfreetype/include/freetype/ftbbox.h
misc/libfreetype/include/freetype/ftbdf.h
misc/libfreetype/include/freetype/ftbitmap.h
misc/libfreetype/include/freetype/ftbzip2.h
misc/libfreetype/include/freetype/ftcache.h
misc/libfreetype/include/freetype/ftchapters.h
misc/libfreetype/include/freetype/ftcid.h
misc/libfreetype/include/freetype/fterrdef.h
misc/libfreetype/include/freetype/fterrors.h
misc/libfreetype/include/freetype/ftgasp.h
misc/libfreetype/include/freetype/ftglyph.h
misc/libfreetype/include/freetype/ftgxval.h
misc/libfreetype/include/freetype/ftgzip.h
misc/libfreetype/include/freetype/ftimage.h
misc/libfreetype/include/freetype/ftincrem.h
misc/libfreetype/include/freetype/ftlcdfil.h
misc/libfreetype/include/freetype/ftlist.h
misc/libfreetype/include/freetype/ftlzw.h
misc/libfreetype/include/freetype/ftmac.h
misc/libfreetype/include/freetype/ftmm.h
misc/libfreetype/include/freetype/ftmodapi.h
misc/libfreetype/include/freetype/ftmoderr.h
misc/libfreetype/include/freetype/ftotval.h
misc/libfreetype/include/freetype/ftoutln.h
misc/libfreetype/include/freetype/ftpfr.h
misc/libfreetype/include/freetype/ftrender.h
misc/libfreetype/include/freetype/ftsizes.h
misc/libfreetype/include/freetype/ftsnames.h
misc/libfreetype/include/freetype/ftstroke.h
misc/libfreetype/include/freetype/ftsynth.h
misc/libfreetype/include/freetype/ftsystem.h
misc/libfreetype/include/freetype/fttrigon.h
misc/libfreetype/include/freetype/fttypes.h
misc/libfreetype/include/freetype/ftwinfnt.h
misc/libfreetype/include/freetype/ftxf86.h
misc/libfreetype/include/freetype/internal/autohint.h
misc/libfreetype/include/freetype/internal/ftcalc.h
misc/libfreetype/include/freetype/internal/ftdebug.h
misc/libfreetype/include/freetype/internal/ftdriver.h
misc/libfreetype/include/freetype/internal/ftgloadr.h
misc/libfreetype/include/freetype/internal/ftmemory.h
misc/libfreetype/include/freetype/internal/ftobjs.h
misc/libfreetype/include/freetype/internal/ftpic.h
misc/libfreetype/include/freetype/internal/ftrfork.h
misc/libfreetype/include/freetype/internal/ftserv.h
misc/libfreetype/include/freetype/internal/ftstream.h
misc/libfreetype/include/freetype/internal/fttrace.h
misc/libfreetype/include/freetype/internal/ftvalid.h
misc/libfreetype/include/freetype/internal/internal.h
misc/libfreetype/include/freetype/internal/psaux.h
misc/libfreetype/include/freetype/internal/pshints.h
misc/libfreetype/include/freetype/internal/services/svbdf.h
misc/libfreetype/include/freetype/internal/services/svcid.h
misc/libfreetype/include/freetype/internal/services/svgldict.h
misc/libfreetype/include/freetype/internal/services/svgxval.h
misc/libfreetype/include/freetype/internal/services/svkern.h
misc/libfreetype/include/freetype/internal/services/svmm.h
misc/libfreetype/include/freetype/internal/services/svotval.h
misc/libfreetype/include/freetype/internal/services/svpfr.h
misc/libfreetype/include/freetype/internal/services/svpostnm.h
misc/libfreetype/include/freetype/internal/services/svpscmap.h
misc/libfreetype/include/freetype/internal/services/svpsinfo.h
misc/libfreetype/include/freetype/internal/services/svsfnt.h
misc/libfreetype/include/freetype/internal/services/svttcmap.h
misc/libfreetype/include/freetype/internal/services/svtteng.h
misc/libfreetype/include/freetype/internal/services/svttglyf.h
misc/libfreetype/include/freetype/internal/services/svwinfnt.h
misc/libfreetype/include/freetype/internal/services/svxf86nm.h
misc/libfreetype/include/freetype/internal/sfnt.h
misc/libfreetype/include/freetype/internal/t1types.h
misc/libfreetype/include/freetype/internal/tttypes.h
misc/libfreetype/include/freetype/t1tables.h
misc/libfreetype/include/freetype/ttnameid.h
misc/libfreetype/include/freetype/tttables.h
misc/libfreetype/include/freetype/tttags.h
misc/libfreetype/include/freetype/ttunpat.h
misc/libfreetype/include/ft2build.h
misc/libfreetype/modules.cfg
misc/libfreetype/src/autofit/afangles.c
misc/libfreetype/src/autofit/afangles.h
misc/libfreetype/src/autofit/afcjk.c
misc/libfreetype/src/autofit/afcjk.h
misc/libfreetype/src/autofit/afdummy.c
misc/libfreetype/src/autofit/afdummy.h
misc/libfreetype/src/autofit/aferrors.h
misc/libfreetype/src/autofit/afglobal.c
misc/libfreetype/src/autofit/afglobal.h
misc/libfreetype/src/autofit/afhints.c
misc/libfreetype/src/autofit/afhints.h
misc/libfreetype/src/autofit/afindic.c
misc/libfreetype/src/autofit/afindic.h
misc/libfreetype/src/autofit/aflatin.c
misc/libfreetype/src/autofit/aflatin.h
misc/libfreetype/src/autofit/aflatin2.c
misc/libfreetype/src/autofit/aflatin2.h
misc/libfreetype/src/autofit/afloader.c
misc/libfreetype/src/autofit/afloader.h
misc/libfreetype/src/autofit/afmodule.c
misc/libfreetype/src/autofit/afmodule.h
misc/libfreetype/src/autofit/afpic.c
misc/libfreetype/src/autofit/afpic.h
misc/libfreetype/src/autofit/aftypes.h
misc/libfreetype/src/autofit/afwarp.c
misc/libfreetype/src/autofit/afwarp.h
misc/libfreetype/src/autofit/autofit.c
misc/libfreetype/src/base/basepic.c
misc/libfreetype/src/base/basepic.h
misc/libfreetype/src/base/ftadvanc.c
misc/libfreetype/src/base/ftapi.c
misc/libfreetype/src/base/ftbase.c
misc/libfreetype/src/base/ftbase.h
misc/libfreetype/src/base/ftbbox.c
misc/libfreetype/src/base/ftbdf.c
misc/libfreetype/src/base/ftbitmap.c
misc/libfreetype/src/base/ftcalc.c
misc/libfreetype/src/base/ftcid.c
misc/libfreetype/src/base/ftdbgmem.c
misc/libfreetype/src/base/ftdebug.c
misc/libfreetype/src/base/ftfstype.c
misc/libfreetype/src/base/ftgasp.c
misc/libfreetype/src/base/ftgloadr.c
misc/libfreetype/src/base/ftglyph.c
misc/libfreetype/src/base/ftgxval.c
misc/libfreetype/src/base/ftinit.c
misc/libfreetype/src/base/ftlcdfil.c
misc/libfreetype/src/base/ftmac.c
misc/libfreetype/src/base/ftmm.c
misc/libfreetype/src/base/ftobjs.c
misc/libfreetype/src/base/ftotval.c
misc/libfreetype/src/base/ftoutln.c
misc/libfreetype/src/base/ftpatent.c
misc/libfreetype/src/base/ftpfr.c
misc/libfreetype/src/base/ftpic.c
misc/libfreetype/src/base/ftrfork.c
misc/libfreetype/src/base/ftsnames.c
misc/libfreetype/src/base/ftstream.c
misc/libfreetype/src/base/ftstroke.c
misc/libfreetype/src/base/ftsynth.c
misc/libfreetype/src/base/ftsystem.c
misc/libfreetype/src/base/fttrigon.c
misc/libfreetype/src/base/fttype1.c
misc/libfreetype/src/base/ftutil.c
misc/libfreetype/src/base/ftwinfnt.c
misc/libfreetype/src/base/ftxf86.c
misc/libfreetype/src/bdf/bdf.c
misc/libfreetype/src/bdf/bdf.h
misc/libfreetype/src/bdf/bdfdrivr.c
misc/libfreetype/src/bdf/bdfdrivr.h
misc/libfreetype/src/bdf/bdferror.h
misc/libfreetype/src/bdf/bdflib.c
misc/libfreetype/src/bzip2/Jamfile
misc/libfreetype/src/bzip2/ftbzip2.c
misc/libfreetype/src/cache/ftcache.c
misc/libfreetype/src/cache/ftcbasic.c
misc/libfreetype/src/cache/ftccache.c
misc/libfreetype/src/cache/ftccache.h
misc/libfreetype/src/cache/ftccback.h
misc/libfreetype/src/cache/ftccmap.c
misc/libfreetype/src/cache/ftcerror.h
misc/libfreetype/src/cache/ftcglyph.c
misc/libfreetype/src/cache/ftcglyph.h
misc/libfreetype/src/cache/ftcimage.c
misc/libfreetype/src/cache/ftcimage.h
misc/libfreetype/src/cache/ftcmanag.c
misc/libfreetype/src/cache/ftcmanag.h
misc/libfreetype/src/cache/ftcmru.c
misc/libfreetype/src/cache/ftcmru.h
misc/libfreetype/src/cache/ftcsbits.c
misc/libfreetype/src/cache/ftcsbits.h
misc/libfreetype/src/cff/cff.c
misc/libfreetype/src/cff/cffcmap.c
misc/libfreetype/src/cff/cffcmap.h
misc/libfreetype/src/cff/cffdrivr.c
misc/libfreetype/src/cff/cffdrivr.h
misc/libfreetype/src/cff/cfferrs.h
misc/libfreetype/src/cff/cffgload.c
misc/libfreetype/src/cff/cffgload.h
misc/libfreetype/src/cff/cffload.c
misc/libfreetype/src/cff/cffload.h
misc/libfreetype/src/cff/cffobjs.c
misc/libfreetype/src/cff/cffobjs.h
misc/libfreetype/src/cff/cffparse.c
misc/libfreetype/src/cff/cffparse.h
misc/libfreetype/src/cff/cffpic.c
misc/libfreetype/src/cff/cffpic.h
misc/libfreetype/src/cff/cfftoken.h
misc/libfreetype/src/cff/cfftypes.h
misc/libfreetype/src/cid/ciderrs.h
misc/libfreetype/src/cid/cidgload.c
misc/libfreetype/src/cid/cidgload.h
misc/libfreetype/src/cid/cidload.c
misc/libfreetype/src/cid/cidload.h
misc/libfreetype/src/cid/cidobjs.c
misc/libfreetype/src/cid/cidobjs.h
misc/libfreetype/src/cid/cidparse.c
misc/libfreetype/src/cid/cidparse.h
misc/libfreetype/src/cid/cidriver.c
misc/libfreetype/src/cid/cidriver.h
misc/libfreetype/src/cid/cidtoken.h
misc/libfreetype/src/cid/type1cid.c
misc/libfreetype/src/gxvalid/gxvalid.c
misc/libfreetype/src/gxvalid/gxvalid.h
misc/libfreetype/src/gxvalid/gxvbsln.c
misc/libfreetype/src/gxvalid/gxvcommn.c
misc/libfreetype/src/gxvalid/gxvcommn.h
misc/libfreetype/src/gxvalid/gxverror.h
misc/libfreetype/src/gxvalid/gxvfeat.c
misc/libfreetype/src/gxvalid/gxvfeat.h
misc/libfreetype/src/gxvalid/gxvfgen.c
misc/libfreetype/src/gxvalid/gxvjust.c
misc/libfreetype/src/gxvalid/gxvkern.c
misc/libfreetype/src/gxvalid/gxvlcar.c
misc/libfreetype/src/gxvalid/gxvmod.c
misc/libfreetype/src/gxvalid/gxvmod.h
misc/libfreetype/src/gxvalid/gxvmort.c
misc/libfreetype/src/gxvalid/gxvmort.h
misc/libfreetype/src/gxvalid/gxvmort0.c
misc/libfreetype/src/gxvalid/gxvmort1.c
misc/libfreetype/src/gxvalid/gxvmort2.c
misc/libfreetype/src/gxvalid/gxvmort4.c
misc/libfreetype/src/gxvalid/gxvmort5.c
misc/libfreetype/src/gxvalid/gxvmorx.c
misc/libfreetype/src/gxvalid/gxvmorx.h
misc/libfreetype/src/gxvalid/gxvmorx0.c
misc/libfreetype/src/gxvalid/gxvmorx1.c
misc/libfreetype/src/gxvalid/gxvmorx2.c
misc/libfreetype/src/gxvalid/gxvmorx4.c
misc/libfreetype/src/gxvalid/gxvmorx5.c
misc/libfreetype/src/gxvalid/gxvopbd.c
misc/libfreetype/src/gxvalid/gxvprop.c
misc/libfreetype/src/gxvalid/gxvtrak.c
misc/libfreetype/src/gzip/adler32.c
misc/libfreetype/src/gzip/ftgzip.c
misc/libfreetype/src/gzip/infblock.c
misc/libfreetype/src/gzip/infblock.h
misc/libfreetype/src/gzip/infcodes.c
misc/libfreetype/src/gzip/infcodes.h
misc/libfreetype/src/gzip/inffixed.h
misc/libfreetype/src/gzip/inflate.c
misc/libfreetype/src/gzip/inftrees.c
misc/libfreetype/src/gzip/inftrees.h
misc/libfreetype/src/gzip/infutil.c
misc/libfreetype/src/gzip/infutil.h
misc/libfreetype/src/gzip/zconf.h
misc/libfreetype/src/gzip/zlib.h
misc/libfreetype/src/gzip/zutil.c
misc/libfreetype/src/gzip/zutil.h
misc/libfreetype/src/lzw/ftlzw.c
misc/libfreetype/src/lzw/ftzopen.c
misc/libfreetype/src/lzw/ftzopen.h
misc/libfreetype/src/otvalid/otvalid.c
misc/libfreetype/src/otvalid/otvalid.h
misc/libfreetype/src/otvalid/otvbase.c
misc/libfreetype/src/otvalid/otvcommn.c
misc/libfreetype/src/otvalid/otvcommn.h
misc/libfreetype/src/otvalid/otverror.h
misc/libfreetype/src/otvalid/otvgdef.c
misc/libfreetype/src/otvalid/otvgpos.c
misc/libfreetype/src/otvalid/otvgpos.h
misc/libfreetype/src/otvalid/otvgsub.c
misc/libfreetype/src/otvalid/otvjstf.c
misc/libfreetype/src/otvalid/otvmath.c
misc/libfreetype/src/otvalid/otvmod.c
misc/libfreetype/src/otvalid/otvmod.h
misc/libfreetype/src/pcf/README
misc/libfreetype/src/pcf/pcf.c
misc/libfreetype/src/pcf/pcf.h
misc/libfreetype/src/pcf/pcfdrivr.c
misc/libfreetype/src/pcf/pcfdrivr.h
misc/libfreetype/src/pcf/pcferror.h
misc/libfreetype/src/pcf/pcfread.c
misc/libfreetype/src/pcf/pcfread.h
misc/libfreetype/src/pcf/pcfutil.c
misc/libfreetype/src/pcf/pcfutil.h
misc/libfreetype/src/pfr/pfr.c
misc/libfreetype/src/pfr/pfrcmap.c
misc/libfreetype/src/pfr/pfrcmap.h
misc/libfreetype/src/pfr/pfrdrivr.c
misc/libfreetype/src/pfr/pfrdrivr.h
misc/libfreetype/src/pfr/pfrerror.h
misc/libfreetype/src/pfr/pfrgload.c
misc/libfreetype/src/pfr/pfrgload.h
misc/libfreetype/src/pfr/pfrload.c
misc/libfreetype/src/pfr/pfrload.h
misc/libfreetype/src/pfr/pfrobjs.c
misc/libfreetype/src/pfr/pfrobjs.h
misc/libfreetype/src/pfr/pfrsbit.c
misc/libfreetype/src/pfr/pfrsbit.h
misc/libfreetype/src/pfr/pfrtypes.h
misc/libfreetype/src/psaux/afmparse.c
misc/libfreetype/src/psaux/afmparse.h
misc/libfreetype/src/psaux/psaux.c
misc/libfreetype/src/psaux/psauxerr.h
misc/libfreetype/src/psaux/psauxmod.c
misc/libfreetype/src/psaux/psauxmod.h
misc/libfreetype/src/psaux/psconv.c
misc/libfreetype/src/psaux/psconv.h
misc/libfreetype/src/psaux/psobjs.c
misc/libfreetype/src/psaux/psobjs.h
misc/libfreetype/src/psaux/t1cmap.c
misc/libfreetype/src/psaux/t1cmap.h
misc/libfreetype/src/psaux/t1decode.c
misc/libfreetype/src/psaux/t1decode.h
misc/libfreetype/src/pshinter/pshalgo.c
misc/libfreetype/src/pshinter/pshalgo.h
misc/libfreetype/src/pshinter/pshglob.c
misc/libfreetype/src/pshinter/pshglob.h
misc/libfreetype/src/pshinter/pshinter.c
misc/libfreetype/src/pshinter/pshmod.c
misc/libfreetype/src/pshinter/pshmod.h
misc/libfreetype/src/pshinter/pshnterr.h
misc/libfreetype/src/pshinter/pshpic.c
misc/libfreetype/src/pshinter/pshpic.h
misc/libfreetype/src/pshinter/pshrec.c
misc/libfreetype/src/pshinter/pshrec.h
misc/libfreetype/src/psnames/psmodule.c
misc/libfreetype/src/psnames/psmodule.h
misc/libfreetype/src/psnames/psnamerr.h
misc/libfreetype/src/psnames/psnames.c
misc/libfreetype/src/psnames/pspic.c
misc/libfreetype/src/psnames/pspic.h
misc/libfreetype/src/psnames/pstables.h
misc/libfreetype/src/raster/ftmisc.h
misc/libfreetype/src/raster/ftraster.c
misc/libfreetype/src/raster/ftraster.h
misc/libfreetype/src/raster/ftrend1.c
misc/libfreetype/src/raster/ftrend1.h
misc/libfreetype/src/raster/raster.c
misc/libfreetype/src/raster/rasterrs.h
misc/libfreetype/src/raster/rastpic.c
misc/libfreetype/src/raster/rastpic.h
misc/libfreetype/src/sfnt/sfdriver.c
misc/libfreetype/src/sfnt/sfdriver.h
misc/libfreetype/src/sfnt/sferrors.h
misc/libfreetype/src/sfnt/sfnt.c
misc/libfreetype/src/sfnt/sfntpic.c
misc/libfreetype/src/sfnt/sfntpic.h
misc/libfreetype/src/sfnt/sfobjs.c
misc/libfreetype/src/sfnt/sfobjs.h
misc/libfreetype/src/sfnt/ttbdf.c
misc/libfreetype/src/sfnt/ttbdf.h
misc/libfreetype/src/sfnt/ttcmap.c
misc/libfreetype/src/sfnt/ttcmap.h
misc/libfreetype/src/sfnt/ttcmapc.h
misc/libfreetype/src/sfnt/ttkern.c
misc/libfreetype/src/sfnt/ttkern.h
misc/libfreetype/src/sfnt/ttload.c
misc/libfreetype/src/sfnt/ttload.h
misc/libfreetype/src/sfnt/ttmtx.c
misc/libfreetype/src/sfnt/ttmtx.h
misc/libfreetype/src/sfnt/ttpost.c
misc/libfreetype/src/sfnt/ttpost.h
misc/libfreetype/src/sfnt/ttsbit.c
misc/libfreetype/src/sfnt/ttsbit.h
misc/libfreetype/src/sfnt/ttsbit0.c
misc/libfreetype/src/smooth/ftgrays.c
misc/libfreetype/src/smooth/ftgrays.h
misc/libfreetype/src/smooth/ftsmerrs.h
misc/libfreetype/src/smooth/ftsmooth.c
misc/libfreetype/src/smooth/ftsmooth.h
misc/libfreetype/src/smooth/ftspic.c
misc/libfreetype/src/smooth/ftspic.h
misc/libfreetype/src/smooth/smooth.c
misc/libfreetype/src/tools/apinames.c
misc/libfreetype/src/tools/chktrcmp.py
misc/libfreetype/src/tools/cordic.py
misc/libfreetype/src/tools/docmaker/content.py
misc/libfreetype/src/tools/docmaker/docbeauty.py
misc/libfreetype/src/tools/docmaker/docmaker.py
misc/libfreetype/src/tools/docmaker/formatter.py
misc/libfreetype/src/tools/docmaker/sources.py
misc/libfreetype/src/tools/docmaker/tohtml.py
misc/libfreetype/src/tools/docmaker/utils.py
misc/libfreetype/src/tools/ftrandom/ftrandom.c
misc/libfreetype/src/tools/glnames.py
misc/libfreetype/src/tools/test_afm.c
misc/libfreetype/src/tools/test_bbox.c
misc/libfreetype/src/tools/test_trig.c
misc/libfreetype/src/truetype/truetype.c
misc/libfreetype/src/truetype/ttdriver.c
misc/libfreetype/src/truetype/ttdriver.h
misc/libfreetype/src/truetype/tterrors.h
misc/libfreetype/src/truetype/ttgload.c
misc/libfreetype/src/truetype/ttgload.h
misc/libfreetype/src/truetype/ttgxvar.c
misc/libfreetype/src/truetype/ttgxvar.h
misc/libfreetype/src/truetype/ttinterp.c
misc/libfreetype/src/truetype/ttinterp.h
misc/libfreetype/src/truetype/ttobjs.c
misc/libfreetype/src/truetype/ttobjs.h
misc/libfreetype/src/truetype/ttpic.c
misc/libfreetype/src/truetype/ttpic.h
misc/libfreetype/src/truetype/ttpload.c
misc/libfreetype/src/truetype/ttpload.h
misc/libfreetype/src/type1/t1afm.c
misc/libfreetype/src/type1/t1afm.h
misc/libfreetype/src/type1/t1driver.c
misc/libfreetype/src/type1/t1driver.h
misc/libfreetype/src/type1/t1errors.h
misc/libfreetype/src/type1/t1gload.c
misc/libfreetype/src/type1/t1gload.h
misc/libfreetype/src/type1/t1load.c
misc/libfreetype/src/type1/t1load.h
misc/libfreetype/src/type1/t1objs.c
misc/libfreetype/src/type1/t1objs.h
misc/libfreetype/src/type1/t1parse.c
misc/libfreetype/src/type1/t1parse.h
misc/libfreetype/src/type1/t1tokens.h
misc/libfreetype/src/type1/type1.c
misc/libfreetype/src/type42/t42drivr.c
misc/libfreetype/src/type42/t42drivr.h
misc/libfreetype/src/type42/t42error.h
misc/libfreetype/src/type42/t42objs.c
misc/libfreetype/src/type42/t42objs.h
misc/libfreetype/src/type42/t42parse.c
misc/libfreetype/src/type42/t42parse.h
misc/libfreetype/src/type42/t42types.h
misc/libfreetype/src/type42/type42.c
misc/libfreetype/src/winfonts/fnterrs.h
misc/libfreetype/src/winfonts/winfnt.c
misc/libfreetype/src/winfonts/winfnt.h
misc/libfreetype/version.sed
misc/libfreetype/vms_make.com
misc/libopenalbridge/CMakeLists.txt
misc/libopenalbridge/commands.c
misc/libopenalbridge/commands.h
misc/libopenalbridge/globals.h
misc/libopenalbridge/loaders.c
misc/libopenalbridge/loaders.h
misc/libopenalbridge/openalbridge.c
misc/libopenalbridge/openalbridge.def
misc/libopenalbridge/openalbridge.h
misc/libopenalbridge/openalbridge_t.h
misc/libopenalbridge/tester.c
misc/libopenalbridge/wrappers.c
misc/libopenalbridge/wrappers.h
misc/libtremor/Android.mk
misc/libtremor/Xcode/Tremor.xcodeproj/default.mode1v3
misc/libtremor/Xcode/Tremor.xcodeproj/default.pbxuser
misc/libtremor/Xcode/Tremor.xcodeproj/project.pbxproj
misc/libtremor/Xcode/Tremor_Prefix.pch
misc/libtremor/tremor/CHANGELOG
misc/libtremor/tremor/COPYING
misc/libtremor/tremor/Makefile.am
misc/libtremor/tremor/README
misc/libtremor/tremor/Version_script.in
misc/libtremor/tremor/asm_arm.h
misc/libtremor/tremor/autogen.sh
misc/libtremor/tremor/backends.h
misc/libtremor/tremor/bitwise.c
misc/libtremor/tremor/block.c
misc/libtremor/tremor/block.h
misc/libtremor/tremor/codebook.c
misc/libtremor/tremor/codebook.h
misc/libtremor/tremor/codec_internal.h
misc/libtremor/tremor/config_types.h
misc/libtremor/tremor/configure.in
misc/libtremor/tremor/floor0.c
misc/libtremor/tremor/floor1.c
misc/libtremor/tremor/framing.c
misc/libtremor/tremor/info.c
misc/libtremor/tremor/ivorbiscodec.h
misc/libtremor/tremor/ivorbisfile.h
misc/libtremor/tremor/ivorbisfile_example.c
misc/libtremor/tremor/lsp_lookup.h
misc/libtremor/tremor/mapping0.c
misc/libtremor/tremor/mdct.c
misc/libtremor/tremor/mdct.h
misc/libtremor/tremor/mdct_lookup.h
misc/libtremor/tremor/misc.h
misc/libtremor/tremor/ogg.h
misc/libtremor/tremor/os.h
misc/libtremor/tremor/os_types.h
misc/libtremor/tremor/registry.c
misc/libtremor/tremor/registry.h
misc/libtremor/tremor/res012.c
misc/libtremor/tremor/sharedbook.c
misc/libtremor/tremor/synthesis.c
misc/libtremor/tremor/vorbisfile.c
misc/libtremor/tremor/window.c
misc/libtremor/tremor/window.h
misc/libtremor/tremor/window_lookup.h
project_files/Android-build/SDL-android-project/assets/Data/Locale/hedgewars_en.qm
--- a/QTfrontend/campaign.cpp	Sat Jul 27 04:20:49 2013 +0200
+++ b/QTfrontend/campaign.cpp	Sat Jul 27 17:23:26 2013 +0300
@@ -17,47 +17,77 @@
  */
 
 #include "campaign.h"
-
 #include "hwconsts.h"
-
+#include "DataManager.h"
 #include <QSettings>
-
+#include <QObject>
+#include <QLocale>
 
-QStringList getCampMissionList(QString & campaign)
-{
-    QSettings campfile("physfs://Missions/Campaign/" + campaign + "/campaign.ini", QSettings::IniFormat, 0);
-    campfile.setIniCodec("UTF-8");
-    unsigned int mNum = campfile.value("MissionNum", 0).toInt();
-
-    QStringList missionList;
-    for (unsigned int i = 0; i < mNum; i++)
-    {
-      missionList += campfile.value(QString("Mission %1/Name").arg(i + 1)).toString();
-    }
-    return missionList;
-}
-
-unsigned int getCampProgress(QString & teamName, QString & campName)
+QList<MissionInfo> getCampMissionList(QString & campaignName, QString & teamName)
 {
-    QSettings teamfile(cfgdir->absolutePath() + "/Teams/" + teamName + ".hwt", QSettings::IniFormat, 0);
+    QList<MissionInfo> missionInfoList;
+	QSettings teamfile(cfgdir->absolutePath() + "/Teams/" + teamName + ".hwt", QSettings::IniFormat, 0);
     teamfile.setIniCodec("UTF-8");
-    return teamfile.value("Campaign " + campName + "/Progress", 0).toInt();
-}
+    int progress = teamfile.value("Campaign " + campaignName + "/Progress", 0).toInt();
+    int unlockedMissions = teamfile.value("Campaign " + campaignName + "/UnlockedMissions", 0).toInt();
+    
+    QSettings campfile("physfs://Missions/Campaign/" + campaignName + "/campaign.ini", QSettings::IniFormat, 0);
+    campfile.setIniCodec("UTF-8");
+    
+    DataManager & dataMgr = DataManager::instance();
+        // get locale
+        QSettings settings(dataMgr.settingsFileName(),
+                           QSettings::IniFormat);
+        QString loc = settings.value("misc/locale", "").toString();
+        if (loc.isEmpty())
+            loc = QLocale::system().name();
+        QString campaignDescFile = QString("physfs://Locale/campaigns_" + loc + ".txt");
+        // if file is non-existant try with language only
+        if (!QFile::exists(campaignDescFile))
+            campaignDescFile = QString("physfs://Locale/campaigns_" + loc.remove(QRegExp("_.*$")) + ".txt");
+
+        // fallback if file for current locale is non-existant
+        if (!QFile::exists(campaignDescFile))
+            campaignDescFile = QString("physfs://Locale/campaigns_en.txt");
 
-QString getCampaignScript(QString campaign, unsigned int mNum)
-{
-    QSettings campfile("physfs://Missions/Campaign/" + campaign + "/campaign.ini", QSettings::IniFormat, 0);
-    campfile.setIniCodec("UTF-8");
-    return campfile.value(QString("Mission %1/Script").arg(mNum)).toString();
+        QSettings m_info(campaignDescFile, QSettings::IniFormat, 0);
+        m_info.setIniCodec("UTF-8");
+    
+    if(progress>=0 and unlockedMissions==0)
+    {
+		for(unsigned int i=progress+1;i>0;i--)
+		{
+			MissionInfo missionInfo;
+			missionInfo.name = campfile.value(QString("Mission %1/Name").arg(i)).toString();
+			QString script = campfile.value(QString("Mission %1/Script").arg(i)).toString();
+            missionInfo.script = script;
+			missionInfo.description = m_info.value(campaignName+"-"+ script.replace(QString(".lua"),QString("")) + ".desc",
+                                            QObject::tr("No description available")).toString();
+            QString image = campfile.value(QString("Mission %1/Script").arg(i)).toString().replace(QString(".lua"),QString(".png"));
+            missionInfo.image = ":/res/campaign/"+campaignName+"/"+image;
+            if (!QFile::exists(missionInfo.image))
+				missionInfo.image = ":/res/CampaignDefault.png";
+			missionInfoList.append(missionInfo);
+		}
+	} 
+	else if(unlockedMissions>0)
+	{
+		for(int i=1;i<=unlockedMissions;i++)
+		{
+			QString missionNum = QString("%1").arg(i);
+			int missionNumber = teamfile.value("Campaign " + campaignName + "/Mission"+missionNum, -1).toInt();
+			MissionInfo missionInfo;
+			missionInfo.name = campfile.value(QString("Mission %1/Name").arg(missionNumber)).toString();
+			QString script = campfile.value(QString("Mission %1/Script").arg(missionNumber)).toString();
+            missionInfo.script = script;
+			missionInfo.description = m_info.value(campaignName+"-"+ script.replace(QString(".lua"),QString("")) + ".desc",
+                                            QObject::tr("No description available")).toString();
+            QString image = campfile.value(QString("Mission %1/Script").arg(missionNumber)).toString().replace(QString(".lua"),QString(".png"));
+            missionInfo.image = ":/res/campaign/"+campaignName+"/"+image;
+            if (!QFile::exists(missionInfo.image))
+				missionInfo.image = ":/res/CampaignDefault.png";
+			missionInfoList.append(missionInfo);
+		}
+	}
+	return missionInfoList;
 }
-
-QString getCampaignImage(QString campaign, unsigned int mNum)
-{
-    return getCampaignScript(campaign,mNum).replace(QString(".lua"),QString(".png"));
-}
-
-QString getCampaignMissionName(QString campaign, unsigned int mNum)
-{
-    return getCampaignScript(campaign,mNum).replace(QString(".lua"),QString(""));
-}
-
--- a/QTfrontend/campaign.h	Sat Jul 27 04:20:49 2013 +0200
+++ b/QTfrontend/campaign.h	Sat Jul 27 17:23:26 2013 +0300
@@ -20,12 +20,16 @@
 #define CAMPAIGN_H
 
 #include <QString>
-#include <QStringList>
 
-QStringList getCampMissionList(QString & campaign);
-unsigned int getCampProgress(QString & teamName, QString & campName);
-QString getCampaignScript(QString campaign, unsigned int mNum);
-QString getCampaignImage(QString campaign, unsigned int mNum);
-QString getCampaignMissionName(QString campaign, unsigned int mNum);
+class MissionInfo
+{
+	public:
+		QString name;
+		QString description;
+		QString script;
+		QString image;
+};
+
+QList<MissionInfo> getCampMissionList(QString & campaignName, QString & teamName);
 
 #endif
--- a/QTfrontend/hedgewars.qrc	Sat Jul 27 04:20:49 2013 +0200
+++ b/QTfrontend/hedgewars.qrc	Sat Jul 27 17:23:26 2013 +0300
@@ -38,12 +38,15 @@
         <file>res/campaign/A_Classic_Fairytale/queen.png</file>
         <file>res/campaign/A_Classic_Fairytale/enemy.png</file>
         <file>res/campaign/A_Classic_Fairytale/epil.png</file>
+        <file>res/campaign/A_Space_Adventure/cosmos.png</file>
+        <file>res/campaign/A_Space_Adventure/moon01.png</file>
         <file>res/bonus.png</file>
         <file>res/Hedgehog.png</file>
         <file>res/net.png</file>
         <file>res/About.png</file>
         <file>res/SimpleGame.png</file>
         <file>res/Campaign.png</file>
+        <file>res/CampaignDefault.png</file>
         <file>res/Multiplayer.png</file>
         <file>res/Trainings.png</file>
         <file>res/Background.png</file>
--- a/QTfrontend/hwform.cpp	Sat Jul 27 04:20:49 2013 +0200
+++ b/QTfrontend/hwform.cpp	Sat Jul 27 17:23:26 2013 +0300
@@ -199,6 +199,7 @@
     UpdateTeamsLists();
     InitCampaignPage();
     UpdateCampaignPage(0);
+    UpdateCampaignPageMission(0);
     UpdateWeapons();
 
     // connect all goBack signals
@@ -306,6 +307,7 @@
     connect(ui.pageTraining, SIGNAL(startMission(const QString&)), this, SLOT(startTraining(const QString&)));
 
     connect(ui.pageCampaign->BtnStartCampaign, SIGNAL(clicked()), this, SLOT(StartCampaign()));
+    connect(ui.pageCampaign->btnPreview, SIGNAL(clicked()), this, SLOT(StartCampaign()));
     connect(ui.pageCampaign->CBTeam, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPage(int)));
     connect(ui.pageCampaign->CBCampaign, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPage(int)));
     connect(ui.pageCampaign->CBMission, SIGNAL(currentIndexChanged(int)), this, SLOT(UpdateCampaignPageMission(int)));
@@ -1721,13 +1723,9 @@
 void HWForm::StartCampaign()
 {
     CreateGame(0, 0, 0);
-
-    QComboBox *combo = ui.pageCampaign->CBMission;
     QString camp = ui.pageCampaign->CBCampaign->currentText().replace(QString(" "),QString("_"));
-    unsigned int mNum = combo->count() - combo->currentIndex();
-    QString miss = getCampaignScript(camp, mNum);
+    QString miss = campaignMissionInfo[ui.pageCampaign->CBMission->currentIndex()].script;
     QString campTeam = ui.pageCampaign->CBTeam->currentText();
-
     game->StartCampaign(camp, miss, campTeam);
 }
 
@@ -1892,85 +1890,34 @@
     }
 }
 
-
 void HWForm::UpdateCampaignPage(int index)
 {
     Q_UNUSED(index);
-
     HWTeam team(ui.pageCampaign->CBTeam->currentText());
-    ui.pageCampaign->CBMission->clear();
-
     QString campaignName = ui.pageCampaign->CBCampaign->currentText().replace(QString(" "),QString("_"));
-    QStringList missionEntries = getCampMissionList(campaignName);
-    QString tName = team.name();
-    unsigned int n = missionEntries.count();
-    unsigned int m = getCampProgress(tName, campaignName);
-
-    // if the campaign name changes update the campaignMissionDescriptions list
-    // this will be used later in UpdateCampaignPageMission() to update
-    // the mission description in the campaign page
-    bool updateMissionList = false;
-    QSettings * m_info;
-    if(previousCampaignName.compare(campaignName)!=0 ||
-            previousTeamName.compare(tName) != 0)
+    QString tName = team.name();    
+    
+    campaignMissionInfo = getCampMissionList(campaignName,tName);    
+	ui.pageCampaign->CBMission->clear();
+	
+    for(int i=0;i<campaignMissionInfo.size();i++)
     {
-        if (previousTeamName.compare(tName) != 0 &&
-                previousTeamName.compare("") != 0)
-            index = qMin(m + 1, n);
-        previousCampaignName = campaignName;
-        previousTeamName = tName;
-        updateMissionList = true;
-        // the following code was based on pagetraining.cpp
-        DataManager & dataMgr = DataManager::instance();
-        // get locale
-        QSettings settings(dataMgr.settingsFileName(),
-                           QSettings::IniFormat);
-        QString loc = settings.value("misc/locale", "").toString();
-        if (loc.isEmpty())
-            loc = QLocale::system().name();
-        QString campaignDescFile = QString("physfs://Locale/campaigns_" + loc + ".txt");
-        // if file is non-existant try with language only
-        if (!QFile::exists(campaignDescFile))
-            campaignDescFile = QString("physfs://Locale/campaigns_" + loc.remove(QRegExp("_.*$")) + ".txt");
-
-        // fallback if file for current locale is non-existant
-        if (!QFile::exists(campaignDescFile))
-            campaignDescFile = QString("physfs://Locale/campaigns_en.txt");
-
-        m_info = new QSettings(campaignDescFile, QSettings::IniFormat, this);
-        m_info->setIniCodec("UTF-8");
-        campaignMissionDescriptions.clear();
-        ui.pageCampaign->CBMission->clear();
-    }
-
-    for (unsigned int i = qMin(m + 1, n); i > 0; i--)
-    {
-        if(updateMissionList)
-        {
-            campaignMissionDescriptions += m_info->value(campaignName+"-"+ getCampaignMissionName(campaignName,i) + ".desc",
-                                            tr("No description available")).toString();
-        }
-        ui.pageCampaign->CBMission->addItem(QString("Mission %1: ").arg(i) + QString(missionEntries[i-1]), QString(missionEntries[i-1]));
-    }
-    if(updateMissionList)
-        delete m_info;
-
-    UpdateCampaignPageMission(index);
+		// Maybe not enforce the prefix Mission %1, isn't so nice for the misison with no
+		// specific order
+        ui.pageCampaign->CBMission->addItem(QString("Mission %1: ").arg(campaignMissionInfo.size()-i) + QString(campaignMissionInfo[i].name), QString(campaignMissionInfo[i].name));
+	}
 }
 
 void HWForm::UpdateCampaignPageMission(int index)
 {
-    // update thumbnail
+    // update thumbnail and description
     QString campaignName = ui.pageCampaign->CBCampaign->currentText().replace(QString(" "),QString("_"));
-    unsigned int mNum = ui.pageCampaign->CBMission->count() - ui.pageCampaign->CBMission->currentIndex();
-    QString image = getCampaignImage(campaignName,mNum);
-    ui.pageCampaign->btnPreview->setIcon(QIcon((":/res/campaign/"+campaignName+"/"+image)));
-    // update description
     // when campaign changes the UpdateCampaignPageMission is triggered with wrong values
     // this will cause segfault. This check prevents illegal memory reads
-    if(index > -1 && index < campaignMissionDescriptions.count()) {
+    if(index > -1 && index < campaignMissionInfo.count()) {
         ui.pageCampaign->lbltitle->setText("<h2>"+ui.pageCampaign->CBMission->currentText()+"</h2>");
-        ui.pageCampaign->lbldescription->setText(campaignMissionDescriptions[index]);
+        ui.pageCampaign->lbldescription->setText(campaignMissionInfo[index].description);
+		ui.pageCampaign->btnPreview->setIcon(QIcon(campaignMissionInfo[index].image));
     }
 }
 
--- a/QTfrontend/hwform.h	Sat Jul 27 04:20:49 2013 +0200
+++ b/QTfrontend/hwform.h	Sat Jul 27 17:23:26 2013 +0300
@@ -34,6 +34,7 @@
 #include "ui_hwform.h"
 #include "SDLInteraction.h"
 #include "bgwidget.h"
+#include "campaign.h"
 
 #ifdef __APPLE__
 #include "InstallController.h"
@@ -194,8 +195,8 @@
         AmmoSchemeModel * ammoSchemeModel;
         QStack<int> PagesStack;
         QString previousCampaignName;
-        QString previousTeamName;
-        QStringList campaignMissionDescriptions;
+        QString previousTeamName;     
+        QList<MissionInfo> campaignMissionInfo;
         QTime eggTimer;
         BGWidget * wBackground;
         QSignalMapper * pageSwitchMapper;
Binary file QTfrontend/res/CampaignDefault.png has changed
Binary file QTfrontend/res/campaign/A_Space_Adventure/cosmos.png has changed
Binary file QTfrontend/res/campaign/A_Space_Adventure/moon01.png has changed
--- a/share/hedgewars/Data/Locale/campaigns_en.txt	Sat Jul 27 04:20:49 2013 +0200
+++ b/share/hedgewars/Data/Locale/campaigns_en.txt	Sat Jul 27 17:23:26 2013 +0300
@@ -17,3 +17,9 @@
 A_Classic_Fairytale-enemy.desc="What a great twist! Leaks a lot has to fight side by side with the… “cannibals” against the common enemy. The evil cyborgs!"
 
 A_Classic_Fairytale-epil.desc="Congratulations! Leaks a lot can finally leave in peace and get praised by his new friends and his tribe. Be proud for what you succeed! You can play again previous missions and see the other possible endings."
+
+A_Space_Adventure-cosmos.desc="Hogera, the planet of hogs is about to be hit by a gigantic meteorite. In this race for survival you have to lead PAoTH's best pilot, Hog Solo, in a space trip around the neighbor planets to collect all the 4 pieces of the long lost anti gravity device!"
+A_Space_Adventure-moon01.desc="Hog Solo has landed on the moon to refuel his saucer but professor Hogevil has gone there first and set an ambush! Rescue the catpured PAoTH researchers and drive professor Hogevil away!"
+A_Space_Adventure-ice.desc="ICE TEST"
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/CMakeLists.txt	Sat Jul 27 17:23:26 2013 +0300
@@ -0,0 +1,9 @@
+file(GLOB Config *.ini)
+file(GLOB Missions *.lua)
+file(GLOB Packs *.hwp)
+
+install(FILES
+    ${Config}
+    ${Missions}
+    ${Packs}
+    DESTINATION "${SHAREPATH}Data/Missions/Campaign/A_Space_Adventure")
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/campaign.ini	Sat Jul 27 17:23:26 2013 +0300
@@ -0,0 +1,22 @@
+MissionNum=5
+ResetRetry=1
+
+[Mission 1]
+Name=The Spacetrip
+Script=cosmos.lua
+
+[Mission 2]
+Name=The First Stop
+Script=moon01.lua
+
+[Mission 3]
+Name=FRUIT
+Script=fruit.lua
+
+[Mission 4]
+Name=DESERT
+Script=desert.lua
+
+[Mission 5]
+Name=A White Day
+Script=ice01.lua
Binary file share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/cosmos.hwp has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/cosmos.lua	Sat Jul 27 17:23:26 2013 +0300
@@ -0,0 +1,438 @@
+------------------- ABOUT ----------------------
+--
+-- This map works as a menu for the hero hog to
+-- navigate through planets. It portrays the hogs
+-- planet and above the planets that he'll later
+-- visit.
+
+-- TODO
+-- Save and Load All Check Points
+-- Save hero health
+-- Decide and implement if hero will use gas bombs...
+-- ofc add custom stats page
+-- PROBLEM : What if one makes a bad choice and wants to replay it map, how to reset?
+-- POSSIBLE SOLUTIONS: In game function keys, frontend button...
+
+HedgewarsScriptLoad("/Scripts/Locale.lua")
+HedgewarsScriptLoad("/Scripts/Animate.lua")
+
+----------------- VARIABLES --------------------
+-- globals
+local campaignName = loc("A Space Adventure")
+local missionName = loc("Cosmos")
+local timeForGuard1ToTurn = 1000 * 5 -- 5 sec
+local timeForGuard1ToTurnLeft = timeForGuard1ToTurn
+local saucerAcquired = false
+local checkPointReached = 1 -- 1 is start of the game
+-- dialogs
+local dialog01 = {}
+local dialog02 = {}
+local dialog03 = {}
+local dialog04 = {}
+local dialog05 = {}
+local dialog06 = {}
+-- mission objectives
+local goals = {
+	[dialog01] = {missionName, loc("Getting ready"), loc("Go and collect the crate on top of the column").."|"..loc("Use the sleep gas bomb if the guards spot you!"), 1, 4500},
+	[dialog02] = {missionName, loc("The adventure begins!"), loc("Use the saucer and fly to the moon").."|"..loc("Drive carefully as your fuels are limited"), 1, 4500},
+	[dialog03] = {missionName, loc("An unexpected event!"), loc("Use the saucer and fly away or use the gas bomb to neutralize the guards").."|"..loc("Beware, any damage taken will stay until you take some medicine or visit moon"), 1, 7000}
+}
+-- crates
+local saucerX = 3270
+local saucerY = 1500
+-- hogs
+local hero = {}
+local director = {}
+local doctor = {}
+local guard1 = {}
+local guard2 = {}
+-- teams
+local teamA = {}
+local teamB = {}
+local teamC = {}
+-- hedgehogs values
+hero.name = loc("Hog Solo")
+hero.x = 1450
+hero.y = 1550
+director.name = loc("H")
+director.x = 1350
+director.y = 1550
+doctor.name = loc("Dr.Cornelius")
+doctor.x = 1300
+doctor.y = 1550
+guard1.name = loc("Bob")
+guard1.x = 3350
+guard1.y = 1800
+guard1.turn = false
+guard1.keepTurning = true
+guard2.name = loc("Sam")
+guard2.x = 3400
+guard2.y = 1800
+teamA.name = loc("PAoTH")
+teamA.color = tonumber("FF0000",16) -- red
+teamB.name = loc("Guards")
+teamB.color = tonumber("0033FF",16) -- blue
+teamC.name = loc("Hog Solo")
+teamC.color = tonumber("38D61C",16) -- green
+
+-------------- LuaAPI EVENT HANDLERS ------------------
+function onGameInit()
+	Seed = 35
+	GameFlags = gfSolidLand + gfDisableWind
+	TurnTime = 40000
+	CaseFreq = 0
+	MinesNum = 0
+	Explosives = 0
+	Delay = 5
+	Map = "cosmos_map" -- custom map included in file
+	Theme = "Nature"
+	-- I had originally hero in PAoTH team and changed it, may reconsider though
+	-- PAoTH
+	AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy")	
+	hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
+	AnimSetGearPosition(hero.gear, hero.x, hero.y)	
+	HogTurnLeft(hero.gear, true)
+	AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy")	
+	director.gear = AddHog(director.name, 0, 100, "hair_yellow")
+	AnimSetGearPosition(director.gear, director.x, director.y)
+	doctor.gear = AddHog(doctor.name, 0, 100, "Glasses")
+	AnimSetGearPosition(doctor.gear, doctor.x, doctor.y)
+	-- Guards
+	AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy")
+	guard1.gear = AddHog(guard1.name, 1, 100, "policecap")
+	AnimSetGearPosition(guard1.gear, guard1.x, guard1.y)
+	guard2.gear = AddHog(guard2.name, 1, 100, "policecap")
+	AnimSetGearPosition(guard2.gear, guard2.x, guard2.y)
+	
+	-- get the check point
+	if tonumber(GetCampaignVar("CosmosCheckPoint")) then
+		checkPointReached = tonumber(GetCampaignVar("CosmosCheckPoint"))
+	end
+	-- do checkpoint stuff needed before game starts
+	if checkPointReached == 1 then
+		-- Start of the game
+	elseif checkPointReached == 2 then
+		-- Hero on the column, just took space ship unnoticed
+		AnimSetGearPosition(hero.gear, saucerX, saucerY)
+	elseif checkPointReached == 3 then
+		-- Hero near column, without space ship unnoticed
+	elseif checkPointReached == 4 then
+		-- Hero visited moon for fuels
+		AnimSetGearPosition(hero.gear, 1110, 850)
+	elseif checkPointReached == 5 then
+		-- Hero has visited a planet, he has plenty of fuels and can change planet
+		if GetCampaignVar("Planet") == "moon" then
+			AnimSetGearPosition(hero.gear, 1110, 850)
+		elseif GetCampaignVar("Planet") == "desertPlanet" then
+			AnimSetGearPosition(hero.gear, 3670, 270)
+		elseif GetCampaignVar("Planet") == "fruitPlanet" then
+			AnimSetGearPosition(hero.gear, 2400, 375)
+		elseif GetCampaignVar("Planet") == "icePlanet" then
+			AnimSetGearPosition(hero.gear, 1440, 260)
+		end
+	end
+	
+	AnimInit()
+	AnimationSetup()
+end
+
+function onGameStart()
+	-- wait for the first turn to start
+	AnimWait(hero.gear, 3000)
+
+	FollowGear(hero.gear)
+	ShowMission(loc("A Space Adventure"), loc("Cosmos"), loc("Help Hog Solo to find all the parts of the anti-gravity device.")..
+	"|"..loc("Travel to all the neighbor planets and collect all the pieces"), -amSkip, 0)
+	
+	-- do checkpoint stuff needed after game starts
+	if checkPointReached == 1 then	
+		AddAnim(dialog01)
+		AddAmmo(hero.gear, amGasBomb, 5)
+		AddAmmo(hero.gear, amRope, 2)
+		-- Added for dev/debug purposes, remove before release
+		AddAmmo(hero.gear, amJetpack, 2)
+		AddAmmo(guard1.gear, amDEagle, 2)
+		AddAmmo(guard2.gear, amDEagle, 2)
+		SpawnAmmoCrate(saucerX, saucerY, amJetpack)	
+		-- EVENT HANDLERS
+		AddEvent(onHeroBeforeTreePosition, {hero.gear}, heroBeforeTreePosition, {hero.gear}, 0)
+		AddEvent(onHeroAtSaucerPosition, {hero.gear}, heroAtSaucerPosition, {hero.gear}, 0)
+		AddEvent(onHeroOutOfGuardSight, {hero.gear}, heroOutOfGuardSight, {hero.gear}, 0)
+	elseif checkPointReached == 2 then
+		AddAmmo(hero.gear, amJetpack, 1)
+		AddAnim(dialog02)
+	elseif checkPointReached == 3 then
+		-- Hero near column, without space ship unnoticed
+	elseif checkPointReached == 4 then
+		-- Hero visited moon for fuels
+		AddAnim(dialog05)
+	elseif checkPointReached == 5 then
+		-- Hero has visited a planet, he has plenty of fuels and can change planet
+		AddAmmo(hero.gear, amJetpack, 99)
+	end
+	
+	AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0)
+	AddEvent(onNoFuelAtLand, {hero.gear}, noFuelAtLand, {hero.gear}, 0)
+	-- always check for landings
+	if GetCampaignVar("Planet") ~= "moon" then
+		AddEvent(onMoonLanding, {hero.gear}, moonLanding, {hero.gear}, 0)
+	end
+	if GetCampaignVar("Planet") ~= "desertPlanet" then
+		AddEvent(onDesertPlanetLanding, {hero.gear}, desertPlanetLanding, {hero.gear}, 0)
+	end	
+	if GetCampaignVar("Planet") ~= "fruitPlanet" then
+		AddEvent(onFruitPlanetLanding, {hero.gear}, fruitPlanetLanding, {hero.gear}, 0)
+	end
+	if GetCampaignVar("Planet") ~= "icePlanet" then
+		AddEvent(onIcePlanetLanding, {hero.gear}, icePlanetLanding, {hero.gear}, 0)
+	end
+end
+
+function onGameTick()
+	-- maybe alert this to avoid timeForGuard1ToTurnLeft overflow
+	if timeForGuard1ToTurnLeft == 0 and guard1.keepTurning then
+		guard1.turn = not guard1.turn
+		HogTurnLeft(guard1.gear, guard1.turn)
+		timeForGuard1ToTurnLeft = timeForGuard1ToTurn
+	end
+	timeForGuard1ToTurnLeft = timeForGuard1ToTurnLeft - 1
+	AnimUnWait()
+	if ShowAnimation() == false then
+		return
+	end
+	ExecuteAfterAnimations()
+	CheckEvents()
+end
+
+function onPrecise()
+	if GameTime > 3000 then
+		SetAnimSkip(true)   
+	end
+end
+
+function onAmmoStoreInit()
+	SetAmmo(amJetpack, 0, 0, 0, 1)
+end
+
+function onNewTurn()
+	if CurrentHedgehog == director.gear or CurrentHedgehog == doctor.gear then
+		TurnTimeLeft = 0
+	end
+	if guard1.keepTurning then
+		AnimSwitchHog(hero.gear)
+		TurnTimeLeft = -1
+	end
+end
+
+-------------- EVENTS ------------------
+
+function onHeroBeforeTreePosition(gear)
+	if GetHealth(hero.gear) and GetX(gear) > 2350 then
+		return true
+	end
+	return false
+end
+
+function onHeroAtSaucerPosition(gear)
+	if GetHealth(hero.gear) and GetX(gear) >= saucerX-25 and GetX(gear) <= saucerX+32 and GetY(gear) >= saucerY-32 and GetY(gear) <= saucerY+32 then
+		saucerAcquired = true
+	end
+	if saucerAcquired and GetHealth(hero.gear) and StoppedGear(gear) then
+		return true
+	end
+	return false
+end
+
+function onHeroOutOfGuardSight(gear)
+	if GetHealth(hero.gear) and GetX(gear) < 3100 and GetY(gear) > saucerY-25 and StoppedGear(gear) and not guard1.keepTurning then
+		return true
+	end
+	return false
+end
+
+-- TODO somehow make it to count fall damage
+function onMoonLanding(gear)
+	if GetHealth(hero.gear) and GetX(gear) > 1010 and GetX(gear) < 1220  and GetY(gear) < 1300 and GetY(gear) > 750 and StoppedGear(gear) then
+		return true
+	end
+	return false
+end
+
+function onFruitPlanetLanding(gear)
+	if GetHealth(hero.gear) and GetX(gear) > 2240 and GetX(gear) < 2540  and GetY(gear) < 1100 and StoppedGear(gear) then
+		return true
+	end
+	return false
+end
+
+function onDesertPlanetLanding(gear)
+	if GetHealth(hero.gear) and GetX(gear) > 3568 and GetX(gear) < 4052  and GetY(gear) < 500 and StoppedGear(gear) then
+		return true
+	end
+	return false
+end
+
+function onIcePlanetLanding(gear)
+	if GetHealth(hero.gear) and GetX(gear) > 1330 and GetX(gear) < 1650  and GetY(gear) < 500 and StoppedGear(gear) then
+		return true
+	end
+	return false
+end
+
+function onNoFuelAtLand(gear)
+	if GetHealth(hero.gear) and GetY(gear) > 1400 and GetAmmoCount(gear, amJetpack) == 0 and StoppedGear(gear) then
+		return true
+	end
+	return false
+end
+
+function onHeroDeath(gear)
+	if not GetHealth(gear) then
+		return true
+	end
+	return false
+end
+
+-------------- OUTCOMES ------------------
+
+function heroBeforeTreePosition(gear)
+	AnimSay(gear,loc("Now I have to climb the trees"), SAY_SAY, 4000)
+	AnimCaption(hero.gear, loc("Use the rope to get to the crate"),  4000)
+end
+
+function heroAtSaucerPosition(gear)
+	TurnTimeLeft = 0
+	-- save check point	
+	SaveCampaignVar("CosmosCheckPoint", "2")
+	AddAnim(dialog02)
+	-- check if he was spotted by the guard
+	if guard1.turn then
+		guard1.keepTurning = false
+		AddAnim(dialog03)
+	end	
+end
+
+function heroOutOfGuardSight(gear)
+	guard1.keepTurning = true
+	AddAnim(dialog04)
+end
+
+function moonLanding(gear)
+	AnimCaption(hero.gear,loc("Welcome to the moon!"))
+	SaveCampaignVar("Planet", "moon")
+	if checkPointReached ~= 5 then
+		SaveCampaignVar("CosmosCheckPoint", "4")
+		SaveCampaignVar("HeroHealth",GetHealth(hero.gear))
+	end
+	SaveCampaignVar("UnlockedMissions", "2")
+	SaveCampaignVar("Mission1", "2")
+	SaveCampaignVar("Mission2", "1")
+	EndGame()
+end
+
+function fruitPlanetLanding(gear)
+	if checkPointReached < 5 then
+		AddAnim(dialog06)
+	end
+end
+
+function desertPlanetLanding(gear)
+	if checkPointReached < 5 then
+		AddAnim(dialog06)
+	end
+end
+
+function icePlanetLanding(gear)
+	if checkPointReached < 5 then
+		AddAnim(dialog06)
+	else
+		AnimCaption(hero.gear,loc("Welcome to the planet of ice!"))
+		SaveCampaignVar("Planet", "icePlanet")
+		SaveCampaignVar("UnlockedMissions", "2")
+		SaveCampaignVar("Mission1", "5")
+		SaveCampaignVar("Mission2", "1")
+		EndGame()
+	end
+end
+
+function noFuelAtLand(gear)
+	AddAnim(dialog06)
+end
+
+function heroDeath(gear)
+	EndGame()
+end
+
+-------------- ANIMATIONS ------------------
+
+function Skipanim(anim)
+	if goals[anim] ~= nil then
+		ShowMission(unpack(goals[anim]))
+    end
+    if CurrentHedgehog ~= hero.gear and anim ~= dialog03 then
+		AnimSwitchHog(hero.gear)
+	elseif anim == dialog03 then
+		startCombat()
+	elseif anim == dialog05 or anim == dialog06 then
+		EndGame()
+	end
+end
+
+function AnimationSetup()
+	-- DIALOG 01 - Start
+	AddSkipFunction(dialog01, Skipanim, {dialog01})
+	table.insert(dialog01, {func = AnimWait, args = {doctor.gear, 3000}})
+	--table.insert(dialog01, {func = AnimWait, args = {hero.gear, 2500}, skipFunc = Skipanim, skipArgs = dialog01})
+	table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Near secret base 17 of PAoTH in the rural Hogland..."),  4000}})
+	table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("So Hog Solo, here we are..."), SAY_SAY, 2000}})
+	table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("Behind these trees on the East there is secret base 17"), SAY_SAY, 4000}})
+	table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("You have to continue alone from now on."), SAY_SAY, 3000}})
+	table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("Be careful, the future of Hogera is in your hands!"), SAY_SAY, 7200}})
+	table.insert(dialog01, {func = AnimSay, args = {doctor.gear, loc("We'll use our communicators to contact you"), SAY_SAY, 2600}})
+	table.insert(dialog01, {func = AnimSay, args = {doctor.gear, loc("In am also entrusting you with a rope and a sleep gas bomb"), SAY_SAY, 5000}})
+	table.insert(dialog01, {func = AnimSay, args = {doctor.gear, loc("You may find them handy"), SAY_SAY, 2300}})
+	table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Thank you Dr.Cornelius"), SAY_SAY, 1600}})
+	table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("I'll make good use of them"), SAY_SAY, 4500}})
+	table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("It would be wiser to steal the space ship while PAoTH guards are taking a brake!"), SAY_SAY, 7000}})
+	table.insert(dialog01, {func = AnimSay, args = {director.gear, loc("Remember! Many will seek the anti-gravity device! Now go, hurry up!"), SAY_SAY, 4000}})
+	table.insert(dialog01, {func = AnimSwitchHog, args = {hero.gear}})
+	-- DIALOG 02 - Hero got the saucer
+	AddSkipFunction(dialog02, Skipanim, {dialog02})
+	table.insert(dialog02, {func = AnimWait, args = {hero.gear, 500}})
+	table.insert(dialog02, {func = AnimCaption, args = {hero.gear, loc("CheckPoint reached!"),  4000}})
+	table.insert(dialog02, {func = AnimSay, args = {hero.gear, loc("Got the saucer!"), SAY_SHOUT, 2000}})
+	table.insert(dialog02, {func = AnimSay, args = {director.gear, loc("Nice!"), SAY_SHOUT, 1000}})
+	table.insert(dialog02, {func = AnimSay, args = {director.gear, loc("Now use it and go to the moon PAoTH station to get more fuels!"), SAY_SHOUT, 5000}})
+    table.insert(dialog02, {func = AnimGearWait, args = {hero.gear, 500}})
+    -- DIALOG 03 - Hero got spotted by guard
+	AddSkipFunction(dialog03, Skipanim, {dialog03})
+	table.insert(dialog03, {func = AnimWait, args = {guard1.gear, 4000}})
+	table.insert(dialog03, {func = AnimCaption, args = {guard1.gear, loc("Prepare to battle or flee!"),  4000}})	
+	table.insert(dialog03, {func = AnimSay, args = {guard1.gear, loc("Hey").." "..guard2.name.."! "..loc("Look, someone is stealing the saucer!"), SAY_SHOUT, 4000}})
+	table.insert(dialog03, {func = AnimSay, args = {guard2.gear, loc("I'll get him!"), SAY_SAY, 4000}})
+	table.insert(dialog03, {func = startCombat, args = {guard1.gear}})
+	-- DIALOG 04 - Hero out of sight
+	AddSkipFunction(dialog04, Skipanim, {dialog04})
+	table.insert(dialog04, {func = AnimCaption, args = {guard1.gear, loc("You are out of danger, time to go to the moon!"),  4000}})
+	table.insert(dialog04, {func = AnimSay, args = {guard1.gear, loc("I guess we lost him!"), SAY_SAY, 3000}})
+	table.insert(dialog04, {func = AnimSay, args = {guard2.gear, loc("We should better report this and continue our watch!"), SAY_SAY, 5000}})
+	table.insert(dialog04, {func = AnimSwitchHog, args = {hero.gear}})
+	-- DIALOG 05 - Hero returned from moon without fuels
+	AddSkipFunction(dialog05, Skipanim, {dialog05})
+	table.insert(dialog05, {func = AnimSay, args = {hero.gear, loc("I guess I can't go far without fuels!"), SAY_THINK, 6000}})
+	table.insert(dialog05, {func = AnimSay, args = {hero.gear, loc("Go to go back"), SAY_THINK, 2000}})
+	table.insert(dialog05, {func = EndGame, args = {hero.gear}})
+	-- DIALOG 06 - Landing on wrong planet or on earth if not enough fuels
+	AddSkipFunction(dialog06, Skipanim, {dialog06})
+	table.insert(dialog06, {func = AnimCaption, args = {hero.gear, loc("You have to try again!"),  5000}})
+	table.insert(dialog06, {func = AnimSay, args = {hero.gear, loc("Hm... Now I run out of fuels..."), SAY_THINK, 3000}})
+	table.insert(dialog06, {func = EndGame, args = {hero.gear}})
+end
+
+------------------- custom "animation" functions --------------------------
+
+function startCombat()
+	-- use this so guard2 will gain control
+	AnimSwitchHog(hero.gear)
+	TurnTimeLeft = 0
+end
Binary file share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice01.hwp has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/ice01.lua	Sat Jul 27 17:23:26 2013 +0300
@@ -0,0 +1,232 @@
+------------------- ABOUT ----------------------
+--
+-- In this cold planet hero seeks for a part of the
+-- antigravity device. He has to capture Icy Pit who
+-- knows where the device is hidden. Hero will be
+-- able to use only the ice gun for this mission.
+
+-- TODO
+-- alter map so hero may climb to the higher place
+-- maybe use rope challenge to go there
+-- add checkpoints
+-- fix the stats
+-- add mines to the higher place/final stage
+
+HedgewarsScriptLoad("/Scripts/Locale.lua")
+HedgewarsScriptLoad("/Scripts/Animate.lua")
+
+----------------- VARIABLES --------------------
+-- globals
+local heroAtAntiFlyArea = false
+local heroVisitedAntiFlyArea = false
+local heroAtFinaleStep = false
+-- crates
+local icegunY = 1950
+local icegunX = 260
+-- hogs
+local hero = {}
+local ally = {}
+local bandit1 = {}
+local bandit2 = {}
+local bandit3 = {}
+local bandit4 = {}
+local bandit5 = {}
+-- teams
+local teamA = {}
+local teamB = {}
+local teamC = {}
+local teamD = {}
+-- hedgehogs values
+hero.name = "Hog Solo"
+hero.x = 340
+hero.y = 1840
+hero.dead = false
+ally.name = "Paul McHoggy"
+ally.x = 300
+ally.y = 1840
+bandit1.name = "Thanta"
+bandit1.x = 3240
+bandit1.y = 1280
+bandit2.name = "Billy Frost"
+bandit2.x = 1480
+bandit2.y = 1990
+bandit3.name = "Ice Jake"
+bandit3.x = 1860
+bandit3.y = 1150
+bandit4.name = "John Snow"
+bandit4.x = 3250
+bandit4.y = 970
+bandit5.name = "White Tee"
+bandit5.x = 3300
+bandit5.y = 600
+teamA.name = loc("Allies")
+teamA.color = tonumber("FF0000",16) -- red
+teamB.name = loc("Frozen Bandits")
+teamB.color = tonumber("0033FF",16) -- blues
+teamC.name = loc("Hog Solo")
+teamC.color = tonumber("38D61C",16) -- green
+
+-------------- LuaAPI EVENT HANDLERS ------------------
+
+function onGameInit()
+	Seed = 1
+	--GameFlags = gfDisableWind
+	TurnTime = 25000
+	CaseFreq = 0
+	MinesNum = 0
+	MinesTime = 3000
+	Explosives = 0
+	Delay = 5 
+	Map = "ice01_map"
+	Theme = "Snow"
+	
+	-- Hog Solo
+	AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy")
+	hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
+	AnimSetGearPosition(hero.gear, hero.x, hero.y)
+	HogTurnLeft(hero.gear, true)
+	-- Ally
+	AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy")
+	ally.gear = AddHog(ally.name, 0, 100, "tophats")
+	AnimSetGearPosition(ally.gear, ally.x, ally.y)
+	-- Frozen Bandits
+	AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy")
+	bandit1.gear = AddHog(bandit1.name, 1, 100, "tophats")
+	AnimSetGearPosition(bandit1.gear, bandit1.x, bandit1.y)	
+	HogTurnLeft(bandit1.gear, true)
+	bandit2.gear = AddHog(bandit2.name, 1, 100, "tophats")
+	AnimSetGearPosition(bandit2.gear, bandit2.x, bandit2.y)
+	bandit3.gear = AddHog(bandit3.name, 1, 100, "tophats")
+	AnimSetGearPosition(bandit3.gear, bandit3.x, bandit3.y)
+	bandit4.gear = AddHog(bandit4.name, 1, 100, "tophats")
+	AnimSetGearPosition(bandit4.gear, bandit4.x, bandit4.y)
+	HogTurnLeft(bandit4.gear, true)
+	bandit5.gear = AddHog(bandit5.name, 1, 100, "tophats")
+	AnimSetGearPosition(bandit5.gear, bandit5.x, bandit5.y)
+	HogTurnLeft(bandit5.gear, true)
+	
+	AnimInit()
+	AnimationSetup()	
+end
+
+function onGameStart()
+	AnimWait(hero.gear, 3000)
+	FollowGear(hero.gear)
+	
+	AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 1)
+	AddEvent(onHeroFinalStep, {hero.gear}, heroFinalStep, {hero.gear}, 0)
+	AddEvent(onAntiFlyArea, {hero.gear}, antiFlyArea, {hero.gear}, 1)
+	AddEvent(onNonAntiFlyArea, {hero.gear}, nonAntiFlyArea, {hero.gear}, 1)
+	
+	AddAmmo(hero.gear, amJetpack, 99)
+	AddAmmo(hero.gear, amBazooka, 1)
+	AddAmmo(bandit1.gear, amBazooka, 5)
+	AddAmmo(bandit2.gear, amBazooka, 4)
+	AddAmmo(bandit3.gear, amMine, 2)
+	AddAmmo(bandit3.gear, amGrenade, 3)
+	AddAmmo(bandit4.gear, amBazooka, 5)
+	AddAmmo(bandit5.gear, amBazooka, 5)
+	SpawnAmmoCrate(icegunX, icegunY, amIceGun)
+	
+end
+
+function onNewTurn()		
+	-- round has to start if hero goes near the column
+	if not heroVisitedAntiFlyArea and CurrentHedgehog ~= hero.gear then
+		TurnTimeLeft = 0
+	elseif not heroVisitedAntiFlyArea and CurrentHedgehog == hero.gear then
+		TurnTimeLeft = -1
+	elseif not heroAtFinaleStep and (CurrentHedgehog == bandit1.gear or CurrentHedgehog == bandit4.gear or CurrentHedgehog == bandit5.gear) then		
+		AnimSwitchHog(hero.gear)
+		TurnTimeLeft = 0
+	elseif CurrentHedgehog == ally.gear then
+		TurnTimeLeft = 0
+	end
+end
+
+function onGameTick()
+	AnimUnWait()
+	if ShowAnimation() == false then
+		return
+	end
+	ExecuteAfterAnimations()
+	CheckEvents()
+end
+
+function onAmmoStoreInit()
+	SetAmmo(amIceGun, 0, 0, 0, 8)
+end
+
+function onGearDelete(gear)
+	if gear == hero.gear then
+		hero.dead = true
+	end
+end
+
+-------------- EVENTS ------------------
+
+function onAntiFlyArea(gear)
+	if not hero.dead and (GetX(gear) > 860 or GetY(gear) < 1400) and not heroAtAntiFlyArea then
+		return true
+	end
+	return false
+end
+
+function onNonAntiFlyArea(gear)
+	if not hero.dead and (GetX(gear) < 860 and GetY(gear) > 1400) and heroAtAntiFlyArea then
+		return true
+	end
+	return false
+end
+
+function onHeroDeath(gear)
+	if hero.dead then
+		return true
+	end
+	return false
+end
+
+function onHeroFinalStep(gear)
+	if not hero.dead and GetY(gear) < 900 and GetX(gear) > 1400 then
+		return true
+	end
+	return false
+end
+
+-------------- OUTCOMES ------------------
+
+function antiFlyArea(gear)
+	heroAtAntiFlyArea = true
+	if TurnTimeLeft < -1 then
+		heroVisitedAntiFlyArea = true
+		TurnTimeLeft = 0	
+		FollowGear(hero.gear)
+		AddAmmo(hero.gear, amJetpack, 0)
+		AnimSwitchHog(bandit1.gear)	
+		FollowGear(hero.gear)
+		TurnTimeLeft = 0
+	else
+		AddAmmo(hero.gear, amJetpack, 0)	
+	end
+end
+
+function nonAntiFlyArea(gear)
+	heroAtAntiFlyArea = false
+	AddAmmo(hero.gear, amJetpack, 99)
+end
+
+function heroDeath(gear)
+	SendStat('siGameResult', loc("Hog Solo lost, try again!")) --1
+	-- more custom stats
+	EndGame()
+end
+
+function heroFinalStep(gear)
+	heroAtFinaleStep = true
+end
+
+-------------- ANIMATIONS ------------------
+
+function AnimationSetup()
+
+end
Binary file share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon01.hwp has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/hedgewars/Data/Missions/Campaign/A_Space_Adventure/moon01.lua	Sat Jul 27 17:23:26 2013 +0300
@@ -0,0 +1,449 @@
+------------------- ABOUT ----------------------
+--
+-- This is the first stop of hero's journey.
+-- Here he'll get fuels to continue traveling.
+-- However, the PAoTH allies of the hero have
+-- been taken hostages by professor Hogevil.
+-- So hero has to get whatever available equipement
+-- there is and rescue them.
+
+-- TODO
+-- Fix some glitches when gaining control on animations, on skip I get control of the talking hog
+-- Round time after check point 2
+-- Check if enemy weapons are good
+-- Stats
+-- check points
+-- add a dialog at the end and second event if all minions are dead
+
+HedgewarsScriptLoad("/Scripts/Locale.lua")
+HedgewarsScriptLoad("/Scripts/Animate.lua")
+
+----------------- VARIABLES --------------------
+-- globals
+local campaignName = loc("A Space Adventure")
+local missionName = loc("Moon, stop for fuels!")
+local weaponsAcquired = false
+local battleZoneReached = false
+local checkPointReached = 1 -- 1 is start of the game
+-- dialogs
+local dialog01 = {}
+local dialog02 = {}
+local dialog03 = {}
+local dialog04 = {}
+-- mission objectives
+local goals = {
+	[dialog01] = {missionName, loc("Getting ready"), loc("Go to the upper platform and get the weapons in the crates!"), 1, 4500},
+	[dialog02] = {missionName, loc("Prepare to fight"), loc("Go down and save these PAoTH hogs!"), 1, 5000},
+	[dialog03] = {missionName, loc("The fight begins!"), loc("Neutralize your enemies and be careful!"), 1, 5000},
+	[dialog04] = {missionName, loc("The fight begins!"), loc("Neutralize your enemies and be careful!"), 1, 5000}
+}
+-- crates
+local weaponsY = 100
+local bazookaX = 70
+local parachuteX = 110
+local grenadeX = 160
+local deserteagleX = 200
+-- hogs
+local hero = {}
+local paoth1 = {}
+local paoth2 = {}
+local paoth3 = {}
+local paoth4 = {}
+local professor = {}
+local minion1 = {}
+local minion2 = {}
+local minion3 = {}
+local minion4 = {}
+-- teams
+local teamA = {}
+local teamB = {}
+local teamC = {}
+local teamD = {}
+-- hedgehogs values
+hero.name = "Hog Solo"
+hero.x = 1380
+hero.y = 1750
+hero.dead = false
+paoth1.name = "Joe"
+paoth1.x = 1430
+paoth1.y = 1750
+paoth2.name = "Bruce"
+paoth2.x = 3760
+paoth2.y = 1800
+paoth3.name = "Helena"
+paoth3.x = 3800
+paoth3.y = 1800
+paoth4.name = "Boris"
+paoth4.x = 3860
+paoth4.y = 1800
+professor.name = "Pr.Hogevil"
+professor.x = 3800
+professor.y = 1600
+professor.dead = false
+professor.health = 100
+minion1.name = "Minion"
+minion1.x = 2460
+minion1.y = 1450
+minion2.name = "Minion"
+minion2.x = 2450
+minion2.y = 1900
+minion3.name = "Minion"
+minion3.x = 3500
+minion3.y = 1750
+teamA.name = loc("PAoTH")
+teamA.color = tonumber("FF0000",16) -- red
+teamB.name = loc("Minions")
+teamB.color = tonumber("0033FF",16) -- blue
+teamC.name = loc("Professor")
+teamC.color = tonumber("0033FF",16) -- blue
+teamD.name = loc("Hog Solo")
+teamD.color = tonumber("38D61C",16) -- green
+
+-------------- LuaAPI EVENT HANDLERS ------------------
+
+function onGameInit()
+	Seed = 1
+	GameFlags = gfSolidLand + gfDisableWind
+	TurnTime = 25000
+	CaseFreq = 0
+	MinesNum = 0
+	MinesTime = 3000
+	Explosives = 0
+	Delay = 5 
+	Map = "moon01_map"
+	Theme = "Cheese" -- Because ofc moon is made of cheese :)
+	-- Hog Solo
+	AddTeam(teamD.name, teamD.color, "Bone", "Island", "HillBilly", "cm_birdy")
+	if GetCampaignVar("HeroHealth") and string.len(GetCampaignVar("HeroHealth")) > 0 then
+		hero.gear = AddHog(hero.name, 0, tonumber(GetCampaignVar("HeroHealth")), "war_desertgrenadier1")
+	else
+		hero.gear = AddHog(hero.name, 0, 100, "war_desertgrenadier1")
+	end
+	AnimSetGearPosition(hero.gear, hero.x, hero.y)
+	-- PAoTH
+	AddTeam(teamA.name, teamA.color, "Bone", "Island", "HillBilly", "cm_birdy")
+	paoth1.gear = AddHog(paoth1.name, 0, 100, "scif_2001O")
+	AnimSetGearPosition(paoth1.gear, paoth1.x, paoth1.y)
+	HogTurnLeft(paoth1.gear, true)
+	paoth2.gear = AddHog(paoth2.name, 0, 100, "scif_2001Y")
+	AnimSetGearPosition(paoth2.gear, paoth2.x, paoth2.y)
+	HogTurnLeft(paoth2.gear, true)
+	paoth3.gear = AddHog(paoth3.name, 0, 100, "hair_purple")
+	AnimSetGearPosition(paoth3.gear, paoth3.x, paoth3.y)
+	HogTurnLeft(paoth3.gear, true)
+	paoth4.gear = AddHog(paoth4.name, 0, 100, "scif_2001Y")
+	AnimSetGearPosition(paoth4.gear, paoth4.x, paoth4.y)
+	HogTurnLeft(paoth4.gear, true)
+	-- Professor
+	AddTeam(teamC.name, teamC.color, "Bone", "Island", "HillBilly", "cm_birdy")
+	professor.gear = AddHog(professor.name, 0, 120, "tophats")
+	AnimSetGearPosition(professor.gear, professor.x, professor.y)
+	HogTurnLeft(professor.gear, true)
+	-- Minions
+	AddTeam(teamB.name, teamB.color, "Bone", "Island", "HillBilly", "cm_birdy")
+	minion1.gear = AddHog(minion1.name, 1, 50, "Gasmask")
+	AnimSetGearPosition(minion1.gear, minion1.x, minion1.y)
+	HogTurnLeft(minion1.gear, true)
+	minion2.gear = AddHog(minion2.name, 1, 50, "Gasmask")
+	AnimSetGearPosition(minion2.gear, minion2.x, minion2.y)
+	HogTurnLeft(minion2.gear, true)
+	minion3.gear = AddHog(minion3.name, 1, 50, "Gasmask")
+	AnimSetGearPosition(minion3.gear, minion3.x, minion3.y)
+	HogTurnLeft(minion3.gear, true)
+	
+	-- get the check point
+	if tonumber(GetCampaignVar("Moon01CheckPoint")) then
+		checkPointReached = tonumber(GetCampaignVar("Moon01CheckPoint"))
+	end
+	
+	if checkPointReached == 1 then
+		-- Start of the game
+	elseif checkPointReached == 2 then
+		AnimSetGearPosition(hero.gear, parachuteX, weaponsY)
+	end
+	
+	AnimInit()
+	AnimationSetup()	
+end
+
+function onGameStart()
+	-- wait for the first turn to start
+	AnimWait(hero.gear, 3000)
+	FollowGear(hero.gear)
+	
+	ShowMission(campaignName, missionName, loc("Hog Solo has to refuel his saucer.")..
+	"|"..loc("Rescue the imprisoned PAoTH team and get your fuels!"), -amSkip, 0)
+	
+	AddAmmo(minion1.gear, amDEagle, 10)
+	AddAmmo(minion2.gear, amDEagle, 10)
+	AddAmmo(minion3.gear, amDEagle, 10)
+	AddAmmo(minion1.gear, amBazooka, 2)
+	AddAmmo(minion2.gear, amBazooka, 2)
+	AddAmmo(minion3.gear, amBazooka, 2)
+	AddAmmo(minion1.gear, amGrenade, 2)
+	AddAmmo(minion2.gear, amGrenade, 2)
+	AddAmmo(minion3.gear, amGrenade, 2)
+	
+	-- check for death has to go first
+	AddEvent(onHeroDeath, {hero.gear}, heroDeath, {hero.gear}, 0)
+	AddEvent(onProfessorDeath, {professor.gear}, professorDeath, {professor.gear}, 0)
+	AddEvent(onMinionsDeath, {professor.gear}, minionsDeath, {professor.gear}, 0)
+	AddEvent(onBattleZone, {hero.gear}, battleZone, {hero.gear}, 0)
+	AddEvent(onProfessorHit, {professor.gear}, professorHit, {professor.gear}, 1)
+
+	if checkPointReached == 1 then
+		AddAmmo(hero.gear, amRope, 2)
+		SpawnAmmoCrate(bazookaX, weaponsY, amBazooka)
+		SpawnAmmoCrate(parachuteX, weaponsY, amParachute)
+		SpawnAmmoCrate(grenadeX, weaponsY, amGrenade)
+		SpawnAmmoCrate(deserteagleX, weaponsY, amDEagle)
+		AddEvent(onWeaponsPlatform, {hero.gear}, weaponsPlatform, {hero.gear}, 0)
+		TurnTimeLeft = 0
+		AddAnim(dialog01)
+	elseif checkPointReached == 2 then	
+		AddAmmo(hero.gear, amBazooka, 3)
+		AddAmmo(hero.gear, amParachute, 1)
+		AddAmmo(hero.gear, amGrenade, 6)
+		AddAmmo(hero.gear, amDEagle, 4)
+		SetWind(60)		
+		GameFlags = bor(GameFlags,gfDisableWind)
+		weaponsAcquired = true
+		TurnTimeLeft = 0
+		AddAnim(dialog02)
+	end
+	
+	SendHealthStatsOff()
+end
+
+function onAmmoStoreInit()
+	SetAmmo(amBazooka, 0, 0, 0, 3)
+	SetAmmo(amParachute, 0, 0, 0, 1)
+	SetAmmo(amGrenade, 0, 0, 0, 6)
+	SetAmmo(amDEagle, 0, 0, 0, 4)
+end
+
+function onGameTick()
+	AnimUnWait()
+	if ShowAnimation() == false then
+		return
+	end
+	ExecuteAfterAnimations()
+	CheckEvents()
+	if CurrentHedgehog ~= hero.gear and not battleZone then
+		TurnTimeLeft = 0
+	end
+end
+
+function onNewTurn()		
+	-- rounds start if hero got his weapons or got near the enemies
+	if not weaponsAcquired and not battleZoneReached and CurrentHedgehog ~= hero.gear then
+		TurnTimeLeft = 0
+	elseif weaponsAcquired and not battleZoneReached and CurrentHedgehog ~= hero.gear then
+		battleZoneReached = true
+		AddAnim(dialog04)
+	elseif not weaponsAcquired and not battleZoneReached and CurrentHedgehog == hero.gear then
+		TurnTimeLeft = -1
+	elseif CurrentHedgehog == paoth1.gear or CurrentHedgehog == paoth2.gear
+		or CurrentHedgehog == paoth3.gear or CurrentHedgehog == paoth4.gear then
+		TurnTimeLeft = 0
+	elseif CurrentHedgehog == professor.gear then
+		AnimSwitchHog(hero.gear)
+		TurnTimeLeft = 0
+	end
+end
+
+function onPrecise()
+	if GameTime > 3000 then
+		SetAnimSkip(true)   
+	end
+end
+
+function onGearDelete(gear)
+	if gear == hero.gear then
+		hero.dead = true
+	elseif gear == professor.gear then
+		professor.dead = true
+	end
+end
+
+-------------- EVENTS ------------------
+
+function onWeaponsPlatform(gear)
+	if not hero.dead and GetX(gear) > bazookaX-200 and GetX(gear) < deserteagleX+400  
+		and GetY(gear) < weaponsY+150 and StoppedGear(gear) then
+		return true
+	end
+	return false
+end
+
+function onHeroDeath(gear)
+	if hero.dead then
+		return true
+	end
+	return false
+end
+
+function onBattleZone(gear)
+	if not battleZoneReached and not hero.dead and GetX(gear) > 1900 and StoppedGear(gear) then
+		return true
+	end
+	return false
+end
+
+function onProfessorHit(gear)
+	if GetHealth(gear) then
+		if CurrentHedgehog ~= hero.gear and GetHealth(gear) < professor.health then
+			professor.health = GetHealth(gear)
+			return true
+		elseif GetHealth(gear) < professor.health then
+			professor.health = GetHealth(gear)
+		end
+	end
+	return false
+end
+
+function onProfessorDeath(gear)
+	if professor.dead then
+		return true
+	end
+	return false
+end
+
+function onMinionsDeath(gear)
+	if not (GetHealth(minion1.gear) or GetHealth(minion2.gear) or GetHealth(minion3.gear)) then
+		return true
+	end
+	return false
+end
+
+-------------- OUTCOMES ------------------
+
+function weaponsPlatform(gear)	
+	SaveCampaignVar("Moon01CheckPoint", "2")	
+	SaveCampaignVar("HeroHealth",GetHealth(hero.gear))
+	TurnTimeLeft = 0
+	weaponsAqcuired = true
+	SetWind(60)		
+	GameFlags = bor(GameFlags,gfDisableWind)
+	AddAnim(dialog02)
+end
+
+function heroDeath(gear)
+	SendStat('siGameResult', loc("Hog Solo lost, try again!")) --1
+	SendStat('siCustomAchievement', loc("You have to get the weapons and rescue the PAoTH researchers")) --11
+	SendStat('siPlayerKills','1',teamC.name)
+	SendStat('siPlayerKills','0',teamD.name)
+	EndGame()
+end
+
+function battleZone(gear)
+	TurnTimeLeft = 0
+	battleZoneReached = true
+	if weaponsAqcuired then
+		AddAnim(dialog04)
+	else
+		AddAnim(dialog03)
+	end
+end
+
+function professorHit(gear)
+	if currentHedgehog ~= hero.gear then
+		AnimSay(professor.gear,loc("Don't hit me you fools!"), SAY_SHOUT, 2000)
+	end
+end
+
+function professorDeath(gear)
+	if GetHealth(minion1.gear) then
+		AnimSay(minion1.gear, loc("The boss has fallen! Retreat!"), SAY_SHOUT, 6000)
+	elseif GetHealth(minion2.gear) then
+		AnimSay(minion2.gear, loc("The boss has fallen! Retreat!"), SAY_SHOUT, 6000)
+	elseif GetHealth(minion3.gear) then
+		AnimSay(minion3.gear, loc("The boss has fallen! Retreat!"), SAY_SHOUT, 6000)
+	end
+	ParseCommand("teamgone " .. teamB.name)
+	AnimCaption(hero.gear, loc("Congrats! You made them run away!"), 6000)
+	AnimWait(hero.gear,5000)	
+	
+	SendStat('siGameResult', loc("Hog Solo win, conrgatulations!")) --1
+	SendStat('siCustomAchievement', loc("Eliminated the professor Hogevil")) --11
+	SendStat('siCustomAchievement', loc("Drove the minions away")) --11
+	SendStat('siPlayerKills','1',teamD.name)
+	SendStat('siPlayerKills','0',teamC.name)
+	SaveCampaignVar("CosmosCheckPoint", "5") -- hero got fuels
+	EndGame()
+end
+
+function minionsDeath(gear)
+	-- do staffs here
+	AnimSay(professor.gear, loc("I may lost that battle, but I haven't lost the war yet!"), SAY_SHOUT, 6000)
+	ParseCommand("teamgone " .. teamC.name)
+	AnimCaption(hero.gear, loc("Congrats! You won!"), 6000)
+	AnimWait(hero.gear,5000)	
+	
+	SendStat('siGameResult', loc("Hog Solo win, conrgatulations!")) --1
+	SendStat('siCustomAchievement', loc("Eliminated the evil minions")) --11
+	SendStat('siCustomAchievement', loc("Drove the professor away")) --11
+	SendStat('siPlayerKills','1',teamD.name)
+	SendStat('siPlayerKills','0',teamC.name)
+	SaveCampaignVar("CosmosCheckPoint", "5") -- hero got fuels	
+	EndGame()
+end
+
+-------------- ANIMATIONS ------------------
+
+function Skipanim(anim)
+	if goals[anim] ~= nil then
+		ShowMission(unpack(goals[anim]))
+    end
+    if anim == dialog03 then
+		startCombat()
+	else
+		AnimSwitchHog(hero.gear)
+	end
+end
+
+function AnimationSetup()
+	-- DIALOG 01 - Start, welcome to moon
+	AddSkipFunction(dialog01, Skipanim, {dialog01})
+	table.insert(dialog01, {func = AnimWait, args = {hero.gear, 3000}})
+	table.insert(dialog01, {func = AnimCaption, args = {hero.gear, loc("Near PAoTH base at moon..."),  4000}})
+	table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("Hey Hog Solo! Finaly you have come..."), SAY_SAY, 2000}})
+	table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("It seems that Professor Hogevil learned for your arrival!"), SAY_SAY, 4000}})
+	table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("Now he have captured the rest of the PAoTH team and awaits to capture you!"), SAY_SAY, 5000}})
+	table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("We have to hurry! Are you armed?"), SAY_SAY, 4300}})
+	table.insert(dialog01, {func = AnimWait, args = {hero.gear, 500}})
+	table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("No, I am afraid I had to travel light"), SAY_SAY, 2500}})
+	table.insert(dialog01, {func = AnimWait, args = {paoth1.gear, 500}})
+	table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("Ok, then you have to go and take some of the waepons we have hidden in case of an emergency!"), SAY_SAY, 7000}})
+	table.insert(dialog01, {func = AnimSay, args = {paoth1.gear, loc("They are up there! Take that rope and hurry!"), SAY_SAY, 7000}})
+	table.insert(dialog01, {func = AnimSay, args = {hero.gear, loc("Ehm... ok..."), SAY_SAY, 2500}})
+	table.insert(dialog01, {func = AnimSwitchHog, args = {hero.gear}})
+	-- DIALOG 02 - To the weapons platform
+	AddSkipFunction(dialog02, Skipanim, {dialog02})
+	table.insert(dialog02, {func = AnimCaption, args = {hero.gear, loc("Checkpoint reached!"),  4000}})
+	table.insert(dialog02, {func = AnimSay, args = {hero.gear, loc("I've made it! YEAAAAAH!"), SAY_SHOUT, 4000}})
+	table.insert(dialog02, {func = AnimSay, args = {paoth1.gear, loc("Nice! Now hurry up and get down! You have to rescue my friends!"), SAY_SHOUT, 7000}})
+	table.insert(dialog02, {func = AnimSwitchHog, args = {hero.gear}})
+	-- DIALOG 03 - Hero spotted and has no weapons
+	AddSkipFunction(dialog03, Skipanim, {dialog03})
+	table.insert(dialog03, {func = AnimCaption, args = {hero.gear, loc("Get ready to fight!"), 4000}})
+	table.insert(dialog03, {func = AnimSay, args = {minion1.gear, loc("Look boss! There is the target!"), SAY_SHOUT, 4000}})
+	table.insert(dialog03, {func = AnimSay, args = {professor.gear, loc("Prepare for battle!"), SAY_SHOUT, 4000}})
+	table.insert(dialog03, {func = AnimSay, args = {hero.gear, loc("Oops, I've been spotted and I have no weapons! I am doomed!"), SAY_THINK, 4000}})
+	table.insert(dialog03, {func = startCombat, args = {hero.gear}})
+	-- DIALOG 04 - Hero spotted and *HAS* weapons
+	AddSkipFunction(dialog04, Skipanim, {dialog04})
+	table.insert(dialog04, {func = AnimCaption, args = {hero.gear, loc("Get ready to fight!"), 4000}})
+	table.insert(dialog04, {func = AnimSay, args = {minion1.gear, loc("Look boss! There is the target!"), SAY_SHOUT, 4000}})
+	table.insert(dialog04, {func = AnimSay, args = {professor.gear, loc("Prepare for battle!"), SAY_SHOUT, 4000}})
+	table.insert(dialog04, {func = AnimSay, args = {hero.gear, loc("Here we go!"), SAY_THINK, 4000}})
+	table.insert(dialog04, {func = startCombat, args = {hero.gear}})
+end
+
+------------------- custom "animation" functions --------------------------
+
+function startCombat()
+	-- use this so guard2 will gain control
+	AnimSwitchHog(minion3.gear)
+	TurnTimeLeft = 0
+end
--- a/share/hedgewars/Data/Missions/Campaign/CMakeLists.txt	Sat Jul 27 04:20:49 2013 +0200
+++ b/share/hedgewars/Data/Missions/Campaign/CMakeLists.txt	Sat Jul 27 17:23:26 2013 +0300
@@ -1,4 +1,5 @@
 add_subdirectory("A_Classic_Fairytale")
+add_subdirectory("A_Space_Adventure")
 
 file(GLOB Scripts *.lua)