S3E_MAIN_DECL void IwMain()
{
    srand(time(NULL));

    GameManager *mgr;
    mgr = new GameManager();

    mgr->SetRequestedFPS(100);

    mgr->GetResourceManager()->RegisterResourceGroup("images.group");

    BUG_HANDLE = mgr->GetResourceManager()->RegisterImage("bug");
    SPLAT_HANDLE = mgr->GetResourceManager()->RegisterImage("splat");
    LEAVES_HANDLE = mgr->GetResourceManager()->RegisterImage("leaves");
    ARROW_HANDLE = mgr->GetResourceManager()->RegisterImage("right_arrow");
    FIRE_HANDLE = mgr->GetResourceManager()->RegisterImage("FireBlast");

    TREB_FONT_HANDLE = mgr->GetResourceManager()->RegisterFont("trebuchet16pt");
    COOPER_FONT_HANDLE = mgr->GetResourceManager()->RegisterFont("cooper_24pt");

    GameManager::SetDebugFont(mgr->GetResourceManager()->GetFont(TREB_FONT_HANDLE));

    Iw2DSetFont(mgr->GetResourceManager()->GetFont(TREB_FONT_HANDLE));

    Sprite *background = new Sprite(mgr);
    background->SetImage(mgr->GetResourceManager()->GetImage(LEAVES_HANDLE));
    background->SetBaseLocation(CIwVec2(0, 0));
    background->SetZIndex(-999);
    mgr->RegisterGameObject(background);

    int width = mgr->GetSurfaceWidth();
    int height = mgr->GetSurfaceHeight();

#define SIMPLE_TEST 0
#define MANY_SHIP_TEST 1
#define ORBITER_TEST 2
#define ANIMATION_TEST 3
#define LABELED_SPRITE 4
#define PATH_TEST 5

    int test_selection = SIMPLE_TEST;

    switch(test_selection)
    {
    case SIMPLE_TEST:
        DoSimpleTest(mgr, ARROW_HANDLE, width, height);
        break;

    case MANY_SHIP_TEST:
        DoManyShipTest(mgr, 10, 10, width, height, ARROW_HANDLE);
        break;

    case ORBITER_TEST:
        MakeOrbiters(mgr, width / 2, height / 2, ARROW_HANDLE);
        break;

    case ANIMATION_TEST:
        AnimationTest(mgr, 0, width, height);
        break;

    case LABELED_SPRITE:
        LabeledSprite(mgr, 0, width, height);
        break;

    case PATH_TEST:
        PathTest(mgr, ARROW_HANDLE, width, height);
        break;
    }

    mgr->MainLoop();

    delete mgr;
}
void ResourceManager::SelectFont(int fontHandle)
{
    Iw2DSetFont(GetFont(fontHandle));
}
int main(int argc, char* argv[])
{
	g_pointerdown = false;
	FillDefaultLocalScores();
	// Initialisation of Airplay Studio modules
	Iw2DInit();			// Initialise support for rendering with the standard SW renderer
	IwGxLightingOff();
	IwResManagerInit();
	Load();

	int16 sw = (int16)Iw2DGetSurfaceWidth();
	int16 sh = (int16)Iw2DGetSurfaceHeight();

	PAL_InitData_t palInitData;
	SC_Error_t retCode = SC_Client_New(&g_client, &palInitData, SC_TEST_GAME_ID,
			SC_TEST_GAME_SECRET, "AIW");

	if (retCode != SC_OK) 
		s3eDebugAssertShow(S3E_MESSAGE_CONTINUE_STOP, "Failed to create SC_Client");
	
	IwGetResManager()->LoadGroup("fonts.group");
	LoadGlobalImages();

	LoadMainControls();
	game = new CGame();
	mainmenu = new CMainMenu();
	profile = new CProfile();
	scores = new CScores();


	mainmenu->Load();
	game->Load();
	profile->Load();
	scores->Load();
	CBaseScene *curscene = (CBaseScene *)mainmenu;
	g_curSceneType = stMainMenu;


	uint32 timer = (uint32)s3eTimerGetMs();

	g_AccelerometerEnabled = (s3eAccelerometerStart() == S3E_RESULT_SUCCESS);

	

	while(curscene)
	{

		s3eDeviceYield(0);


		//// Check for user quit
		if (s3eDeviceCheckQuitRequest())
			break;


		int delta = uint32(s3eTimerGetMs()) - timer;
		timer += delta;

		// Make sure the delta-time value is safe
		if (delta < 0)
			delta = 0;
		if (delta > 100)
			delta = 100;

		if (g_AccelerometerEnabled)
		{

			if (!g_waiting)
			{
				if (g_errorDialog->Get_Visible())
				{
					if (UpdatePointer() == petDown)
						CloseErrorDlg();
					else
						g_errorDialog->Update(delta);
				}
				else
				{
					switch (UpdatePointer())
					{
						case petNone: break;
						case petDown: curscene->PointerDown(g_pointerx, g_pointery); break;
						case petUp: curscene->PointerUp(g_pointerx, g_pointery); break;
						case petMove: curscene->PointerMove(g_pointerx, g_pointery); break;
					}
					curscene->Update(delta);
				}
			}
			curscene->Render();
			if (g_waiting)
			{
				Iw2DSetColour(0xeeffffff);
				Iw2DFillRect(CIwSVec2(0, 0), CIwSVec2(sw, sh));

				Iw2DSetColour(0xff000000);
		
				Iw2DSetFont(g_font);
				Iw2DDrawString(g_waitcaption, CIwSVec2(0, 0), CIwSVec2(sw, sh), IW_2D_FONT_ALIGN_CENTRE, IW_2D_FONT_ALIGN_CENTRE);
			}
			if (g_errorDialog->Get_Visible())
			{
				g_errorDialog->Render();
			}
		}


		Iw2DSurfaceShow();

		switch (g_curSceneType)
		{
			case stNone: curscene = 0; break;
			case stMainMenu: 
			{
				if (curscene != (CBaseScene *)mainmenu)
				{
					curscene = (CBaseScene *)mainmenu; 
					curscene->Show();
				}
			}	break;
			case stGame: 
			{
				if (curscene != (CBaseScene *)game)
				{
					curscene = (CBaseScene *)game;
					curscene->Show();
				}
			}break;

			case stProfile: 
			{
				if (curscene != (CBaseScene *)profile)
				{
					curscene = (CBaseScene *)profile;
					curscene->Show();
				}
			}break;
			case stScores: 
			{
				if (curscene != (CBaseScene *)scores)
				{
					curscene = (CBaseScene *)scores;
					curscene->Show();
				}
			}break;
		}
	}
	Save();
	delete game;
	delete mainmenu;
	delete profile;
	delete scores;

	SC_Client_Release(g_client);
	UnloadGlobalImages();
	UnloadMainControls();
	if (g_AccelerometerEnabled)
		s3eAccelerometerStop();
	// Terminate system modules
	IwResManagerTerminate();
	Iw2DTerminate();

	return 0;
}