diff --git a/src/sdl/CSettings.cpp b/src/sdl/CSettings.cpp
new file mode 100644
index 000000000..5bafe7526
--- /dev/null
+++ b/src/sdl/CSettings.cpp
@@ -0,0 +1,168 @@
+/*
+ * CSettings.cpp
+ *
+ * Created on: 08.06.2009
+ * Author: gerstrong
+ */
+
+#include "../fileio/CParser.h"
+#include "../CLogFile.h"
+#include "CSettings.h"
+#include "CVideoDriver.h"
+#include "sound/CSound.h"
+
+CSettings::CSettings() {
+ // TODO Auto-generated constructor stub
+
+}
+
+CSettings::~CSettings() {
+ // TODO Auto-generated destructor stub
+}
+
+
+short CSettings::saveDrvCfg(void)
+{
+ short retval = 0;
+
+ CParser Parser;
+
+ Parser.saveIntValue("bpp","Video",g_pVideoDriver->getDepth());
+ Parser.saveIntValue("frameskip","Video",g_pVideoDriver->getFrameskip());
+
+ if(g_pVideoDriver->getFullscreen())
+ Parser.saveIntValue("fullscreen","Video",1);
+ else
+ Parser.saveIntValue("fullscreen","Video",0);
+
+ if(g_pVideoDriver->isOpenGL())
+ Parser.saveIntValue("OpenGL","Video",1);
+ else
+ Parser.saveIntValue("OpenGL","Video",0);
+
+
+ Parser.saveIntValue("width","Video",g_pVideoDriver->getWidth());
+ Parser.saveIntValue("height","Video",g_pVideoDriver->getHeight());
+ Parser.saveIntValue("scale","Video",g_pVideoDriver->getZoomValue());
+ Parser.saveIntValue("OGLfilter","Video",g_pVideoDriver->getOGLFilter());
+ Parser.saveIntValue("filter","Video",g_pVideoDriver->getFiltermode());
+ Parser.saveIntValue("autoframeskip","Video",g_pVideoDriver->getTargetFPS());
+ Parser.saveIntValue("aspect","Video",g_pVideoDriver->getAspectCorrection() ? 1 : 0);
+
+ Parser.saveIntValue("channels","Audio",(g_pSound->getAudioSpec()).channels);
+ Parser.saveIntValue("format","Audio",(g_pSound->getAudioSpec()).format);
+ Parser.saveIntValue("rate","Audio",(g_pSound->getAudioSpec()).freq);
+ Parser.saveIntValue("mixerch","Audio",(g_pSound->getMixingchannels()));
+
+ Parser.saveParseFile();
+
+ return retval;
+}
+
+short CSettings::loadDrvCfg(void)
+{
+ short retval = 0;
+ CParser Parser;
+
+ if(!Parser.loadParseFile())
+ {
+ retval = 1;
+ }
+ else
+ {
+ int width, height, depth;
+
+ depth = Parser.getIntValue("bpp","Video");
+ width = Parser.getIntValue("width","Video");
+ height = Parser.getIntValue("height","Video");
+
+ if(depth*width*height < 0)
+ g_pLogFile->ftextOut(RED,"Error reading the configuration file. It appears to be damaged!");
+
+ g_pVideoDriver->setMode(width, height, depth);
+
+ g_pVideoDriver->setFrameskip(Parser.getIntValue("frameskip","Video"));
+
+ if((Parser.getIntValue("fullscreen","Video")) == 1)
+ g_pVideoDriver->isFullscreen(true);
+
+ g_pVideoDriver->setOGLFilter(Parser.getIntValue("OGLfilter","Video"));
+ g_pVideoDriver->setZoom(Parser.getIntValue("scale","Video"));
+ g_pVideoDriver->setTargetFPS(Parser.getIntValue("autoframeskip","Video"));
+
+ g_pVideoDriver->setFilter(Parser.getIntValue("filter","Video"));
+
+ if(Parser.getIntValue("OpenGL","Video") == 1)
+ g_pVideoDriver->enableOpenGL(true);
+ else
+ g_pVideoDriver->enableOpenGL(false);
+
+ if(Parser.getIntValue("channels","Audio") == 2)
+ g_pSound->setSoundmode(Parser.getIntValue("rate","Audio"), true);
+ else
+ g_pSound->setSoundmode(Parser.getIntValue("rate","Audio"), false);
+ }
+
+ return retval;
+}
+
+void CSettings::setOption(stOption *options, int opt, const char *name, char value)
+{
+ if (name != NULL)
+ options[opt].name = (char*) name;
+
+ options[opt].value = value;
+}
+
+void CSettings::loadDefaultGameCfg(stOption *Option)
+{
+ setOption(Option,OPT_FULLYAUTOMATIC, "autogun", 0);
+ setOption(Option,OPT_SUPERPOGO, "superpogo", 0);
+ setOption(Option,OPT_ALLOWPKING, "pking", 1);
+ setOption(Option,OPT_CHEATS, "allcheats", 0);
+ setOption(Option,OPT_TWOBUTTON, "two-button-firing", 0);
+ setOption(Option,OPT_KEYCARDSTACK, "keycard-stacking", 0);
+ setOption(Option,OPT_ANALOGJOYSTICK, "analog-joystick", 1);
+}
+
+short CSettings::loadGameCfg(stOption *Option)
+{
+ short retval = 0;
+ int i;
+ CParser Parser;
+
+ if(!Parser.loadParseFile())
+ return 1;
+
+ for (i = 0; i < NUM_OPTIONS; i++)
+ {
+ Option[i].value = Parser.getIntValue(Option[i].name,"Game");
+ if(Option[i].value == -1)
+ {
+ loadDefaultGameCfg(Option);
+ break;
+ }
+ }
+
+ return retval;
+
+ g_pLogFile->ftextOut("
Your personal settings were loaded successfully...
");
+ return 0;
+}
+
+void CSettings::saveGameCfg(stOption *Option)
+{
+ int i;
+ CParser Parser;
+
+ if(Parser.loadParseFile())
+ {
+ for (i = 0; i < NUM_OPTIONS; i++)
+ Parser.saveIntValue(Option[i].name,"Game",Option[i].value);
+
+ Parser.saveParseFile();
+ }
+
+ return;
+}
+
diff --git a/src/sdl/CSettings.h b/src/sdl/CSettings.h
new file mode 100644
index 000000000..1c2295da4
--- /dev/null
+++ b/src/sdl/CSettings.h
@@ -0,0 +1,40 @@
+/*
+ * CSettings.h
+ *
+ * Created on: 08.06.2009
+ * Author: gerstrong
+ */
+
+#ifndef CSETTINGS_H_
+#define CSETTINGS_H_
+
+#define OPT_FULLYAUTOMATIC 0
+#define OPT_SUPERPOGO 1
+#define OPT_ALLOWPKING 2
+#define OPT_CHEATS 3
+#define OPT_TWOBUTTON 4
+#define OPT_KEYCARDSTACK 5
+#define OPT_ANALOGJOYSTICK 6
+#define OPT_MEAN 7
+
+#define NUM_OPTIONS 8
+
+typedef struct stOption
+{
+ char *name;
+ char value;
+} stOption;
+
+class CSettings {
+public:
+ CSettings();
+ virtual ~CSettings();
+ short saveDrvCfg(void);
+ short loadDrvCfg(void);
+ short loadGameCfg(stOption *Option);
+ void saveGameCfg(stOption *Option);
+ void loadDefaultGameCfg(stOption *Option);
+ void setOption(stOption *options, int opt, const char *name, char value);
+};
+
+#endif /* CSETTINGS_H_ */
diff --git a/src/sdl/gp2x.h b/src/sdl/gp2x.h
new file mode 100755
index 000000000..a480b80fb
--- /dev/null
+++ b/src/sdl/gp2x.h
@@ -0,0 +1,32 @@
+#ifndef _GP2X_H_
+#define _GP2X_H_
+
+#define GP2X_BUTTON_UP 0
+#define GP2X_BUTTON_DOWN 4
+#define GP2X_BUTTON_LEFT 2
+#define GP2X_BUTTON_RIGHT 6
+#define GP2X_BUTTON_UPLEFT 1
+#define GP2X_BUTTON_UPRIGHT 7
+#define GP2X_BUTTON_DOWNLEFT 3
+#define GP2X_BUTTON_DOWNRIGHT 5
+
+#define GP2X_BUTTON_A 12
+#define GP2X_BUTTON_B 13
+#define GP2X_BUTTON_X 14
+#define GP2X_BUTTON_Y 15
+#define GP2X_BUTTON_L 10
+#define GP2X_BUTTON_R 11
+#define GP2X_BUTTON_CLICK 18
+#define GP2X_BUTTON_START 8
+#define GP2X_BUTTON_SELECT 9
+#define GP2X_BUTTON_VOLUP 16
+#define GP2X_BUTTON_VOLDOWN 17
+
+#define VOLUME_MIN 0
+#define VOLUME_MAX 100
+#define VOLUME_CHANGE_RATE 2
+#define VOLUME_NOCHG 0
+#define VOLUME_DOWN 1
+#define VOLUME_UP 2
+
+#endif
diff --git a/src/vorticon/CCredits.cpp b/src/vorticon/CCredits.cpp
new file mode 100644
index 000000000..2851dd3c4
--- /dev/null
+++ b/src/vorticon/CCredits.cpp
@@ -0,0 +1,161 @@
+/*
+ * CCredits.cpp
+ *
+ * Created on: 20.06.2009
+ * Author: gerstrong
+ */
+
+#include "../keen.h"
+#include "CCredits.h"
+#include "../sdl/CTimer.h"
+#include "../sdl/CInput.h"
+#include "../CGraphics.h"
+#include "../include/menu.h"
+#include "../include/gamedo.h"
+
+CCredits::CCredits() {
+ // TODO Auto-generated constructor stub
+
+}
+
+CCredits::~CCredits() {
+ // TODO Auto-generated destructor stub
+}
+
+void CCredits::Render(stCloneKeenPlus *pCKP)
+{
+ // TODO: Now that the new intro function works, the old one must become
+ // a credits class
+
+ int mid[7];
+ char scrolltext[7][80];
+ unsigned char pagenumber = 0;
+ int timer = 8;
+ int scrolly = 0;
+ bool cancel = false;
+
+ fade.mode = FADE_GO;
+ fade.rate = FADE_NORM;
+ fade.dir = FADE_IN;
+ fade.curamt = 0;
+ fade.fadetimer = 0;
+
+ showmapatpos(90, 104<<4, 32, 0, pCKP);
+
+ memset(scrolltext,0,7*80);
+
+ do
+ {
+ // do fades
+ gamedo_fades();
+
+ // blit the scrollbuffer to the display
+ gamedo_frameskipping_blitonly();
+
+ gamedo_AnimatedTiles();
+
+ if(fade.mode != FADE_COMPLETE)
+ continue;
+
+ if(timer<15) timer++;
+ else
+ {
+ timer=0;
+ if(scrolly>-7*8) scrolly--;
+ else
+ {
+ scrolly = 200;
+ memset(scrolltext,0,7*80);
+
+ switch(pagenumber)
+ {
+ case 0:
+ strcpy(scrolltext[0],"Commander Genius");
+ strcpy(scrolltext[1],"Interpreter of");
+ strcpy(scrolltext[2],"Commander Keen 1-3");
+ strcpy(scrolltext[3],"Credits");
+ break;
+ case 1:
+ strcpy(scrolltext[0],"based on the engine of");
+ strcpy(scrolltext[1],"CloneKeen by Shaw");
+ strcpy(scrolltext[2],"and");
+ strcpy(scrolltext[3],"CloneKeenPlus by Gerstrong");
+ break;
+
+ case 2:
+ strcpy(scrolltext[0],"Developers");
+ strcpy(scrolltext[1],"of");
+ strcpy(scrolltext[2],"Commander Genius");
+ strcpy(scrolltext[3],"");
+ strcpy(scrolltext[4],"Aka CloneKeenPlus");
+ break;
+
+ case 3:
+ strcpy(scrolltext[0],"Main Developer:");
+ strcpy(scrolltext[1]," Gerstrong");
+ strcpy(scrolltext[2],"Handheld Devices (Wiz):");
+ strcpy(scrolltext[3]," Pickle");
+ strcpy(scrolltext[4],"Resources:");
+ strcpy(scrolltext[5]," Tulip");
+ break;
+
+ case 4:
+ strcpy(scrolltext[0],"Thanks to ID Software");
+ strcpy(scrolltext[1],"for the wonderful");
+ strcpy(scrolltext[2],"\"Commander Keen\" series.");
+ strcpy(scrolltext[3],"");
+ strcpy(scrolltext[4],"\"As a child, I spent way too");
+ strcpy(scrolltext[5],"much time playing these games.");
+ break;
+
+
+ case 5:
+ strcpy(scrolltext[0],"And now I have spent way");
+ strcpy(scrolltext[1],"too much time programming");
+ strcpy(scrolltext[2],"this game.");
+ strcpy(scrolltext[3],"");
+ strcpy(scrolltext[4],"...");
+ strcpy(scrolltext[5],"Hmmm... Does history repeat itself?");
+ strcpy(scrolltext[6],":)");
+ break;
+
+ case 6:
+ strcpy(scrolltext[0],"This is my tribute to");
+ strcpy(scrolltext[1],"the \"Keen legacy\".");
+ strcpy(scrolltext[2],"");
+ strcpy(scrolltext[3],"Enjoy the Game.\"");
+ strcpy(scrolltext[4],"");
+ strcpy(scrolltext[5]," -Katy");
+ break;
+
+ default: cancel = true; break;
+ }
+
+ for(int j=0 ; j<7 ; j++)
+ mid[j] = (320-(strlen(scrolltext[j])<<3))>>1;
+ pagenumber++;
+ }
+ }
+
+ for(int j=0 ; j<7 ; j++)
+ g_pGraphics->sb_font_draw_inverse( (unsigned char*) scrolltext[j], mid[j], scrolly+(j<<3));
+
+ if( g_pInput->getPressedAnyCommand() )
+ {
+ cancel = true;
+ fade.dir = FADE_OUT;
+ fade.curamt = PAL_FADE_SHADES;
+ fade.fadetimer = 0;
+ fade.rate = FADE_NORM;
+ fade.mode = FADE_GO;
+ }
+
+ if(g_pInput->getExitEvent()) cancel=true;
+
+ g_pInput->pollEvents();
+ g_pTimer->SpeedThrottle();
+
+ } while(!(cancel && fade.mode == FADE_COMPLETE));
+
+
+}
diff --git a/src/vorticon/CCredits.h b/src/vorticon/CCredits.h
new file mode 100644
index 000000000..37aca4195
--- /dev/null
+++ b/src/vorticon/CCredits.h
@@ -0,0 +1,19 @@
+/*
+ * CCredits.h
+ *
+ * Created on: 20.06.2009
+ * Author: gerstrong
+ */
+
+#ifndef CCREDITS_H_
+#define CCREDITS_H_
+
+class CCredits {
+public:
+ CCredits();
+ virtual ~CCredits();
+
+ void Render(stCloneKeenPlus *pCKP);
+};
+
+#endif /* CCREDITS_H_ */
diff --git a/src/vorticon/CIntro.cpp b/src/vorticon/CIntro.cpp
new file mode 100644
index 000000000..bbde4021d
--- /dev/null
+++ b/src/vorticon/CIntro.cpp
@@ -0,0 +1,108 @@
+/*
+ * CIntro.cpp
+ *
+ * Created on: 19.06.2009
+ * Author: gerstrong
+ */
+
+#include "../keen.h"
+#include "CIntro.h"
+#include "../sdl/CTimer.h"
+#include "../sdl/CInput.h"
+#include "../CGraphics.h"
+#include "../include/menu.h"
+#include "../include/gamedo.h"
+
+CIntro::CIntro() {
+ // TODO Auto-generated constructor stub
+
+}
+
+CIntro::~CIntro() {
+ // TODO Auto-generated destructor stub
+}
+
+void CIntro::Render(stCloneKeenPlus *pCKP)
+{
+ // TODO: Now that the new intro function works, the old one must become
+ // a credits class
+
+ int bmnum[7];
+ int mid[7];
+ int timer = 0;
+ int introtime = 5000; // Total time to elapse until Main menu opens
+ int scrolly = 200;
+ bool cancel=false;
+
+ fade.mode = FADE_GO;
+ fade.rate = FADE_NORM;
+ fade.dir = FADE_IN;
+ fade.curamt = 0;
+ fade.fadetimer = 0;
+
+ showmapatpos(90, 104<<4, 32, 0, pCKP);
+
+ // Load the Title Bitmap
+ bmnum[0] = g_pGraphics->getBitmapNumberFromName("AN");
+ bmnum[1] = g_pGraphics->getBitmapNumberFromName("APOGEE");
+ bmnum[2] = g_pGraphics->getBitmapNumberFromName("PRESENT");
+ bmnum[3] = g_pGraphics->getBitmapNumberFromName("OFAN");
+ bmnum[4] = g_pGraphics->getBitmapNumberFromName("IDSOFT");
+ bmnum[5] = g_pGraphics->getBitmapNumberFromName("SOFTWARE");
+ bmnum[6] = g_pGraphics->getBitmapNumberFromName("PRODUCT");
+
+ for(int j=0 ; j<7 ; j++)
+ mid[j] = (320/2)-(bitmaps[bmnum[j]].xsize/2);
+
+ do
+ {
+ // do fades
+ gamedo_fades();
+
+
+ // blit the scrollbuffer to the display
+ gamedo_frameskipping_blitonly();
+
+ g_pGraphics->drawBitmap(mid[0], scrolly, bmnum[0]);
+ g_pGraphics->drawBitmap(mid[1], scrolly+9, bmnum[1]);
+ g_pGraphics->drawBitmap(mid[2], scrolly+43, bmnum[2]);
+ g_pGraphics->drawBitmap(mid[3], scrolly+56, bmnum[3]);
+ g_pGraphics->drawBitmap(mid[4], scrolly+77, bmnum[4]);
+ g_pGraphics->drawBitmap(mid[5], scrolly+87, bmnum[5]);
+ g_pGraphics->drawBitmap(mid[6], scrolly+120, bmnum[6]);
+
+ gamedo_AnimatedTiles();
+
+ if(fade.mode != FADE_COMPLETE)
+ continue;
+
+ if(timer<7) timer++;
+ else
+ {
+ timer=0;
+ if(scrolly>35) scrolly--;
+ }
+
+ if( g_pInput->getPressedAnyCommand() )
+ {
+ cancel = true;
+ fade.dir = FADE_OUT;
+ fade.curamt = PAL_FADE_SHADES;
+ fade.fadetimer = 0;
+ fade.rate = FADE_NORM;
+ fade.mode = FADE_GO;
+ }
+
+ if(g_pInput->getExitEvent()) cancel=true;
+
+ g_pInput->pollEvents();
+ g_pTimer->SpeedThrottle();
+
+
+ if( introtime <= 0 ) break;
+ introtime--;
+
+ } while(!(cancel && fade.mode == FADE_COMPLETE));
+
+
+}
diff --git a/src/vorticon/CIntro.h b/src/vorticon/CIntro.h
new file mode 100644
index 000000000..3d39d901a
--- /dev/null
+++ b/src/vorticon/CIntro.h
@@ -0,0 +1,20 @@
+/*
+ * CIntro.h
+ *
+ * Created on: 19.06.2009
+ * Author: gerstrong
+ */
+
+#ifndef CINTRO_H_
+#define CINTRO_H_
+
+
+class CIntro {
+public:
+ CIntro();
+ virtual ~CIntro();
+
+ void Render(stCloneKeenPlus *pCKP);
+};
+
+#endif /* CINTRO_H_ */