/*========================================================================*/ int ControlIdling(PyMOLGlobals * G) { CControl *I = G->Control; return (I->sdofActive || MoviePlaying(G) || SettingGetGlobal_b(G, cSetting_rock) || SettingGet(G, cSetting_sculpting)); }
TinselEngine::~TinselEngine() { if (MoviePlaying()) FinishBMV(); AudioCD.stop(); delete _sound; delete _midiMusic; delete _pcmMusic; delete _console; delete _driver; _screenSurface.free(); FreeSaveScenes(); FreeTextBuffer(); FreeHandleTable(); FreeActors(); FreeObjectList(); FreeGlobalProcesses(); FreeGlobals(); delete _scheduler; }
void TinselEngine::NextGameCycle(void) { // Dim Music _pcmMusic->dimIteration(); // Check for scene change ChangeScene(false); // Allow a user event for this schedule ResetEcount(); // schedule process _scheduler->schedule(); if (MoviePlaying()) CopyMovieToScreen(); else // redraw background DrawBackgnd(); // Why waste resources on yet another process? FettleTimers(); }
/*========================================================================*/ static void ControlDraw(Block * block) { PyMOLGlobals *G = block->G; register CControl *I = G->Control; int x, y; int nButton = I->NButton; int but_num; float lightEdge[3] = { 0.65F, 0.65F, 0.65F }; float darkEdge[3] = { 0.3F, 0.3F, 0.3F }; float pushed[3] = { 0.8F, 0.8F, 0.8F }; if(G->HaveGUI && G->ValidContext) { int control_width = I->Block->rect.right - (I->Block->rect.left + cControlLeftMargin); #ifdef PURE_OPENGL_ES_2 /* TODO */ #else glColor3fv(I->Block->BackColor); #endif BlockFill(I->Block); #ifdef PURE_OPENGL_ES_2 /* TODO */ #else glColor3fv(I->Block->TextColor); #endif { int top, left, bottom, right; left = I->Block->rect.left + 1; bottom = I->Block->rect.bottom + 1; top = I->Block->rect.top - (cControlTopMargin - 1); right = left + 5; /* This draws the separator on the left side of the movie control buttons */ #ifdef PURE_OPENGL_ES_2 /* TODO */ #else #ifdef _PYMOL_GL_DRAWARRAYS { const GLint polyVerts[] = { right, top, right, bottom, left, bottom, left, bottom, left, top, right, top, right, top - 1, right, bottom, left + 1, bottom, left + 1, bottom, left + 1, top - 1, right, top - 1, right - 1, top - 1, right - 1, bottom + 1, left + 1, bottom + 1, left + 1, bottom + 1, left + 1, top - 1, right - 1, top - 1, }; const GLfloat colorVerts[] = { 0.8F, 0.8F, 0.8F, 1.f, 0.8F, 0.8F, 0.8F, 1.f, 0.8F, 0.8F, 0.8F, 1.f, 0.8F, 0.8F, 0.8F, 1.f, 0.8F, 0.8F, 0.8F, 1.f, 0.8F, 0.8F, 0.8F, 1.f, 0.3F, 0.3F, 0.3F, 1.f, 0.3F, 0.3F, 0.3F, 1.f, 0.3F, 0.3F, 0.3F, 1.f, 0.3F, 0.3F, 0.3F, 1.f, 0.3F, 0.3F, 0.3F, 1.f, 0.3F, 0.3F, 0.3F, 1.f, I->ButtonColor[0], I->ButtonColor[1], I->ButtonColor[2], 1.f, I->ButtonColor[0], I->ButtonColor[1], I->ButtonColor[2], 1.f, I->ButtonColor[0], I->ButtonColor[1], I->ButtonColor[2], 1.f, I->ButtonColor[0], I->ButtonColor[1], I->ButtonColor[2], 1.f, I->ButtonColor[0], I->ButtonColor[1], I->ButtonColor[2], 1.f, I->ButtonColor[0], I->ButtonColor[1], I->ButtonColor[2], 1.f }; glEnableClientState(GL_VERTEX_ARRAY); glEnableClientState(GL_COLOR_ARRAY); glColorPointer(4, GL_FLOAT, 0, colorVerts); glVertexPointer(2, GL_INT, 0, polyVerts); glDrawArrays(GL_TRIANGLES, 0, 18); glDisableClientState(GL_VERTEX_ARRAY); glDisableClientState(GL_COLOR_ARRAY); } #else glColor3f(0.8F, 0.8F, 0.8F); glBegin(GL_POLYGON); glVertex2i(right, top); glVertex2i(right, bottom); glVertex2i(left, bottom); glVertex2i(left, top); glEnd(); glColor3f(0.3F, 0.3F, 0.3F); glBegin(GL_POLYGON); glVertex2i(right, top - 1); glVertex2i(right, bottom); glVertex2i(left + 1, bottom); glVertex2i(left + 1, top - 1); glEnd(); glColor3fv(I->ButtonColor); glBegin(GL_POLYGON); glVertex2i(right - 1, top - 1); glVertex2i(right - 1, bottom + 1); glVertex2i(left + 1, bottom + 1); glVertex2i(left + 1, top - 1); glEnd(); #endif #endif } y = I->Block->rect.top - cControlTopMargin; for(but_num = 0; but_num < nButton; but_num++) { int but_width; int but_left; int but_bottom; int but_height; but_left = I->Block->rect.left + cControlLeftMargin + (but_num * control_width) / nButton; but_width = (((but_num + 1) * control_width / nButton) - ((but_num) * control_width / nButton)) - 1; but_bottom = y - (cControlBoxSize - 1); but_height = cControlBoxSize; if((but_num == I->Active)) { draw_button(but_left, but_bottom, but_width, but_height, lightEdge, darkEdge, pushed); } else if(((but_num == 6) && ((int) SettingGet(G, cSetting_seq_view))) || ((but_num == 3) && (MoviePlaying(G))) || ((but_num == 7) && (SettingGetGlobal_b(G, cSetting_rock))) || ((but_num == 8) && (SettingGetGlobal_b(G, cSetting_full_screen)))) { draw_button(but_left, but_bottom, but_width, but_height, lightEdge, darkEdge, I->ActiveColor); } else { draw_button(but_left, but_bottom, but_width, but_height, lightEdge, darkEdge, I->ButtonColor); } if(control_width > 100) { x = but_left + (but_width - cControlBoxSize) / 2; #ifdef PURE_OPENGL_ES_2 /* TODO */ #else glColor3fv(I->Block->TextColor); #endif switch (but_num) { case 0: #ifdef PURE_OPENGL_ES_2 /* TODO */ #else #ifdef _PYMOL_GL_DRAWARRAYS { const GLint polyVerts[] = { x + (cControlBoxSize - 1) - cControlInnerMargin, y - cControlInnerMargin, x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin, x + cControlInnerMargin, y - (cControlBoxSize / 2) }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, polyVerts); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableClientState(GL_VERTEX_ARRAY); } { const GLint lineVerts[] = { x + cControlInnerMargin, y - cControlInnerMargin, x + cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, lineVerts); glDrawArrays(GL_LINES, 0, 2); glDisableClientState(GL_VERTEX_ARRAY); } #else glBegin(GL_TRIANGLES); glVertex2i(x + (cControlBoxSize - 1) - cControlInnerMargin, y - cControlInnerMargin); glVertex2i(x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin); glVertex2i(x + cControlInnerMargin, y - (cControlBoxSize / 2)); glEnd(); glBegin(GL_LINES); glVertex2i(x + cControlInnerMargin, y - cControlInnerMargin); glVertex2i(x + cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin); glEnd(); #endif #endif break; case 1: #ifdef PURE_OPENGL_ES_2 /* TODO */ #else #ifdef _PYMOL_GL_DRAWARRAYS { const GLint polyVerts[] = { x + cControlBoxSize / 2 + 2, y - (cControlBoxSize / 2), x + (cControlBoxSize - 1) - cControlInnerMargin, y - cControlInnerMargin, x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin, x + cControlInnerMargin, y - (cControlBoxSize / 2) }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, polyVerts); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); } #else glBegin(GL_POLYGON); glVertex2i(x + cControlBoxSize / 2 + 2, y - (cControlBoxSize / 2)); glVertex2i(x + (cControlBoxSize - 1) - cControlInnerMargin, y - cControlInnerMargin); glVertex2i(x + cControlInnerMargin, y - (cControlBoxSize / 2)); glVertex2i(x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin); glEnd(); #endif #endif break; case 2: #ifdef PURE_OPENGL_ES_2 /* TODO */ #else #ifdef _PYMOL_GL_DRAWARRAYS { const GLint polyVerts[] = { x + cControlInnerMargin, y - cControlInnerMargin, x + cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin, x + (cControlBoxSize - 1) - cControlInnerMargin, y - cControlInnerMargin, x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, polyVerts); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); } #else glBegin(GL_POLYGON); glVertex2i(x + cControlInnerMargin, y - cControlInnerMargin); glVertex2i(x + cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin); glVertex2i(x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin); glVertex2i(x + (cControlBoxSize - 1) - cControlInnerMargin, y - cControlInnerMargin); glEnd(); #endif #endif break; case 3: #ifdef PURE_OPENGL_ES_2 /* TODO */ #else #ifdef _PYMOL_GL_DRAWARRAYS { const GLint polyVerts[] = { x + cControlInnerMargin, y - cControlInnerMargin + 1, x + cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin - 1, x + (cControlBoxSize) - cControlInnerMargin, y - (cControlBoxSize / 2) }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, polyVerts); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableClientState(GL_VERTEX_ARRAY); } #else glBegin(GL_TRIANGLES); glVertex2i(x + cControlInnerMargin, y - cControlInnerMargin + 1); glVertex2i(x + cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin - 1); glVertex2i(x + (cControlBoxSize) - cControlInnerMargin, y - (cControlBoxSize / 2)); glEnd(); #endif #endif break; case 4: #ifdef PURE_OPENGL_ES_2 /* TODO */ #else #ifdef _PYMOL_GL_DRAWARRAYS { const GLint polyVerts[] = { x + cControlBoxSize / 2 - 2, y - (cControlBoxSize / 2), x + cControlInnerMargin, y - cControlInnerMargin, x + cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin, x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize / 2) }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, polyVerts); glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); glDisableClientState(GL_VERTEX_ARRAY); } #else glBegin(GL_POLYGON); glVertex2i(x + cControlBoxSize / 2 - 2, y - (cControlBoxSize / 2)); glVertex2i(x + cControlInnerMargin, y - cControlInnerMargin); glVertex2i(x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize / 2)); glVertex2i(x + cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin); glEnd(); #endif #endif break; case 5: #ifdef PURE_OPENGL_ES_2 /* TODO */ #else #ifdef _PYMOL_GL_DRAWARRAYS { const GLint polyVerts[] = { x + cControlInnerMargin, y - cControlInnerMargin, x + cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin, x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize / 2) }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, polyVerts); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableClientState(GL_VERTEX_ARRAY); } { const GLint lineVerts[] = { x + (cControlBoxSize - 1) - cControlInnerMargin, y - cControlInnerMargin, x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, lineVerts); glDrawArrays(GL_LINES, 0, 2); glDisableClientState(GL_VERTEX_ARRAY); } #else glBegin(GL_TRIANGLES); glVertex2i(x + cControlInnerMargin, y - cControlInnerMargin); glVertex2i(x + cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin); glVertex2i(x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize / 2)); glEnd(); glBegin(GL_LINES); glVertex2i(x + (cControlBoxSize - 1) - cControlInnerMargin, y - cControlInnerMargin); glVertex2i(x + (cControlBoxSize - 1) - cControlInnerMargin, y - (cControlBoxSize - 1) + cControlInnerMargin); glEnd(); #endif #endif break; case 6: TextDrawStrAt(G, "S", x + cControlInnerMargin, y - cControlBoxSize + cControlInnerMargin + 1); break; case 7: /* TextDrawStrAt(G,"R",x+cControlInnerMargin, y-cControlBoxSize+cControlInnerMargin+1); */ #ifdef PURE_OPENGL_ES_2 /* TODO */ #else #ifdef _PYMOL_GL_DRAWARRAYS { const GLint polyVerts[] = { x + (cControlBoxSize / 2) + cControlSpread, y - cControlInnerMargin, x + (cControlBoxSize / 2), y - (cControlBoxSize) + cControlInnerMargin, x + (cControlBoxSize / 2) - cControlSpread, y - cControlInnerMargin }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, polyVerts); glDrawArrays(GL_TRIANGLES, 0, 3); glDisableClientState(GL_VERTEX_ARRAY); } #else glBegin(GL_POLYGON); glVertex2i(x + (cControlBoxSize / 2) + cControlSpread, y - cControlInnerMargin); glVertex2i(x + (cControlBoxSize / 2), y - (cControlBoxSize) + cControlInnerMargin); glVertex2i(x + (cControlBoxSize / 2) - cControlSpread, y - cControlInnerMargin); glEnd(); #endif #endif break; case 8: TextDrawStrAt(G, "F", x + cControlInnerMargin, y - cControlBoxSize + cControlInnerMargin + 1); break; } } } #ifdef _MACPYMOL_XCODE if((I->Block->rect.bottom==0) && (!SettingGetGlobal_b(G,cSetting_full_screen))) { int x1 = I->Block->rect.right + 1; int y1 = I->Block->rect.bottom - 1; int x2 = I->Block->rect.right - 3; int y2 = I->Block->rect.bottom - 5; glColor3f(0.3F, 0.3F, 0.3F); #ifdef PURE_OPENGL_ES_2 /* TODO */ #else #ifdef _PYMOL_GL_DRAWARRAYS { const GLint lineVerts[] = { x1, y1, x2, y2, x1, y1 + 4, x2 - 4, y2, x1, y1 + 8, x2 - 8, y2, x1, y1 + 12, x2 - 12, y2, x1 - 4, y1 + 12, x2 - 12, y2 + 4, x1 - 8, y1 + 12, x2 - 12, y2 + 8, x1 - 12, y1 + 12, x2 - 12, y2 + 12 }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, lineVerts); glDrawArrays(GL_LINES, 0, 14); glDisableClientState(GL_VERTEX_ARRAY); } #else glBegin(GL_LINES); glVertex2i(x1, y1); glVertex2i(x2, y2); x2 -= 4; y1 += 4; glVertex2i(x1, y1); glVertex2i(x2, y2); x2 -= 4; y1 += 4; glVertex2i(x1, y1); glVertex2i(x2, y2); x2 -= 4; y1 += 4; glVertex2i(x1, y1); glVertex2i(x2, y2); y2 += 4; x1 -= 4; glVertex2i(x1, y1); glVertex2i(x2, y2); y2 += 4; x1 -= 4; glVertex2i(x1, y1); glVertex2i(x2, y2); y2 += 4; x1 -= 4; glVertex2i(x1, y1); glVertex2i(x2, y2); glEnd(); #endif #endif x1 = I->Block->rect.right + 1; y1 = I->Block->rect.bottom - 2; x2 = I->Block->rect.right - 2; y2 = I->Block->rect.bottom - 5; #ifdef PURE_OPENGL_ES_2 /* TODO */ #else glColor3f(0.85F, 0.85F, 0.85F); #ifdef _PYMOL_GL_DRAWARRAYS { const GLint lineVerts[] = { x1, y1, x2, y2, x1, y1 + 4, x2 - 4, y2, x1, y1 + 8, x2 - 8, y2, x1, y1 + 12, x2 - 12, y2, x1 - 4, y1 + 12, x2 - 12, y2 + 4, x1 - 8, y1 + 12, x2 - 12, y2 + 8, x1 - 12, y1 + 12, x2 - 12, y2 + 12 }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, lineVerts); glDrawArrays(GL_LINES, 0, 14); glDisableClientState(GL_VERTEX_ARRAY); } #else glBegin(GL_LINES); glVertex2i(x1, y1); glVertex2i(x2, y2); x2 -= 4; y1 += 4; glVertex2i(x1, y1); glVertex2i(x2, y2); x2 -= 4; y1 += 4; glVertex2i(x1, y1); glVertex2i(x2, y2); x2 -= 4; y1 += 4; glVertex2i(x1, y1); glVertex2i(x2, y2); y2 += 4; x1 -= 4; glVertex2i(x1, y1); glVertex2i(x2, y2); y2 += 4; x1 -= 4; glVertex2i(x1, y1); glVertex2i(x2, y2); y2 += 4; x1 -= 4; glVertex2i(x1, y1); glVertex2i(x2, y2); glEnd(); #endif #endif x1 = I->Block->rect.right + 1; y1 = I->Block->rect.bottom - 3; x2 = I->Block->rect.right - 1; y2 = I->Block->rect.bottom - 5; #ifdef PURE_OPENGL_ES_2 /* TODO */ #else glColor3f(0.7F, 0.7F, 0.7F); #ifdef _PYMOL_GL_DRAWARRAYS { const GLint lineVerts[] = { x1, y1, x2, y2, x1, y1 + 4, x2 - 4, y2, x1, y1 + 8, x2 - 8, y2, x1, y1 + 12, x2 - 12, y2, x1 - 4, y1 + 12, x2 - 12, y2 + 4, x1 - 8, y1 + 12, x2 - 12, y2 + 8, x1 - 12, y1 + 12, x2 - 12, y2 + 12 }; glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(2, GL_INT, 0, lineVerts); glDrawArrays(GL_LINES, 0, 14); glDisableClientState(GL_VERTEX_ARRAY); } #else glBegin(GL_LINES); glVertex2i(x1, y1); glVertex2i(x2, y2); x2 -= 4; y1 += 4; glVertex2i(x1, y1); glVertex2i(x2, y2); x2 -= 4; y1 += 4; glVertex2i(x1, y1); glVertex2i(x2, y2); x2 -= 4; y1 += 4; glVertex2i(x1, y1); glVertex2i(x2, y2); y2 += 4; x1 -= 4; glVertex2i(x1, y1); glVertex2i(x2, y2); y2 += 4; x1 -= 4; glVertex2i(x1, y1); glVertex2i(x2, y2); y2 += 4; x1 -= 4; glVertex2i(x1, y1); glVertex2i(x2, y2); glEnd(); #endif #endif } #endif } }
static int ControlRelease(Block * block, int button, int x, int y, int mod) { PyMOLGlobals *G = block->G; register CControl *I = G->Control; int sel = 0; I->LastPos = x; sel = which_button(I, x, y); if(!I->SkipRelease) { switch (sel) { case 0: SceneSetFrame(G, 4, 0); PLog(G, "cmd.rewind()", cPLog_pym); break; case 1: SceneSetFrame(G, 5, -1); PLog(G, "cmd.back()", cPLog_pym); break; case 2: MoviePlay(G, cMovieStop); if(SettingGet(G, cSetting_sculpting)) SettingSet(G, cSetting_sculpting, 0); if(SettingGetGlobal_b(G, cSetting_rock)) SettingSetGlobal_b(G, cSetting_rock, false); ExecutiveDrawNow(G); OrthoDirty(G); PLog(G, "cmd.mstop()", cPLog_pym); break; case 3: if(!MoviePlaying(G)) { if(mod & cOrthoCTRL) { PLog(G, "cmd.rewind()", cPLog_pym); PLog(G, "cmd.mplay()", cPLog_pym); SceneSetFrame(G, 4, 0); MoviePlay(G, cMoviePlay); } else { PLog(G, "cmd.mplay()", cPLog_pym); MoviePlay(G, cMoviePlay); } } else { MoviePlay(G, cMovieStop); ExecutiveDrawNow(G); OrthoDirty(G); PLog(G, "cmd.mstop()", cPLog_pym); } break; case 4: SceneSetFrame(G, 5, 1); PLog(G, "cmd.forward()", cPLog_pym); break; case 5: if(mod & cOrthoCTRL) { SceneSetFrame(G, 3, 0); PLog(G, "cmd.middle()", cPLog_pym); } else { SceneSetFrame(G, 6, 0); PLog(G, "cmd.ending()", cPLog_pym); } break; case 6: if(SettingGetGlobal_b(G, cSetting_seq_view)) { SettingSetGlobal_b(G, cSetting_seq_view, 0); SeqChanged(G); PLog(G, "cmd.set('seq_view',0)", cPLog_pym); } else { SettingSetGlobal_b(G, cSetting_seq_view, 1); SeqChanged(G); PLog(G, "cmd.set('seq_view',1)", cPLog_pym); } OrthoDirty(G); break; case 7: SettingSetGlobal_b(G, cSetting_rock, !SettingGetGlobal_b(G, cSetting_rock)); if(SettingGetGlobal_b(G, cSetting_rock)) { SceneRestartSweepTimer(G); PLog(G, "cmd.rock(1)", cPLog_pym); } else PLog(G, "cmd.rock(0)", cPLog_pym); SceneRestartFrameTimer(G); OrthoDirty(G); break; case 8: PLog(G, "cmd.fullscreen()", cPLog_pym); ExecutiveFullScreen(G, -1); break; } OrthoDirty(G); OrthoUngrab(G); I->LastClickTime = UtilGetSeconds(G); I->DragFlag = false; I->Active = -1; I->Pressed = -1; } return (1); }
Common::Error TinselEngine::run() { // Initialize backend if (getGameID() == GID_DW2) { #ifndef DW2_EXACT_SIZE initGraphics(640, 480, true); #else initGraphics(640, 432, true); #endif _screenSurface.create(640, 432, 1); } else { initGraphics(320, 200, false); _screenSurface.create(320, 200, 1); } g_system->getEventManager()->registerRandomSource(_random, "tinsel"); _console = new Console(); _scheduler = new Scheduler(); InitSysVars(); // init memory manager MemoryInit(); // load user configuration ReadConfig(); #if 1 // FIXME: The following is taken from RestartGame(). // It may have to be adjusted a bit CountOut = 1; RebootCursor(); RebootDeadTags(); RebootMovers(); resetUserEventTime(); RebootTimers(); RebootScalingReels(); DelayedScene.scene = HookScene.scene = 0; #endif // Load in text strings ChangeLanguage(g_language); // Init palette and object managers, scheduler, keyboard and mouse RestartDrivers(); // load in graphics info SetupHandleTable(); // Actors, globals and inventory icons LoadBasicChunks(); // Continuous game processes CreateConstProcesses(); // allow game to run in the background //RestartBackgroundProcess(); // FIXME: is this still needed? //dumpMusic(); // dumps all of the game's music in external XMIDI files // Load game from specified slot, if any // // TODO: We might want to think about properly taking care of possible // errors when loading the save state. if (ConfMan.hasKey("save_slot")) { if (loadGameState(ConfMan.getInt("save_slot")) == Common::kNoError) loadingFromGMM = true; } // Foreground loop uint32 timerVal = 0; while (!shouldQuit()) { assert(_console); if (_console->isAttached()) _console->onFrame(); // Check for time to do next game cycle if ((g_system->getMillis() > timerVal + GAME_FRAME_DELAY)) { timerVal = g_system->getMillis(); AudioCD.updateCD(); NextGameCycle(); } if (bRestart) { RestartGame(); bRestart = false; bHasRestarted = true; // Set restarted flag } // Save/Restore scene file transfers ProcessSRQueue(); // Handle any playing movie FettleBMV(); #ifdef DEBUG if (bFast) continue; // run flat-out #endif // Loop processing events while there are any pending while (pollEvent()) ; DoCdChange(); if (MoviePlaying() && NextMovieTime()) g_system->delayMillis(MAX<int>(NextMovieTime() - g_system->getMillis() + MovieAudioLag(), 0)); else g_system->delayMillis(10); } // Write configuration WriteConfig(); return Common::kNoError; }