/** * Load game state */ int Game_Load(const char* name) { FILE *f; char *ch, local; local = 1; for(ch=(char*)name;*ch;ch++) { if((*ch == '\\') || (*ch == '/')) { local = 0; break; } } if(local) { char token[512]; snprintf(token, 512, "save/%s", name); f = fopen(token, "rb"); if(f == NULL) { Sys_extWarn("Can not read file \"%s\"", token); return 0; } fclose(f); Engine_LuaClearTasks(); try { engine_lua.doFile(token); } catch(lua::RuntimeError& error) { Sys_DebugLog(LUA_LOG_FILENAME, "%s", error.what()); } catch(lua::LoadError& error) { Sys_DebugLog(LUA_LOG_FILENAME, "%s", error.what()); } } else { f = fopen(name, "rb"); if(f == NULL) { Sys_extWarn("Can not read file \"%s\"", name); return 0; } fclose(f); Engine_LuaClearTasks(); try { engine_lua.doFile(name); } catch(lua::RuntimeError& error) { Sys_DebugLog(LUA_LOG_FILENAME, "%s", error.what()); } catch(lua::LoadError& error) { Sys_DebugLog(LUA_LOG_FILENAME, "%s", error.what()); } } return 1; }
void Engine_InitSDLImage() { int flags = IMG_INIT_JPG | IMG_INIT_PNG; int init = IMG_Init(flags); if((init & flags) != flags) { Sys_DebugLog(LOG_FILENAME, "SDL_Image error: failed to initialize JPG and/or PNG support."); } }
// FIXME: make a buffer size safe vsprintf? void Con_Printf (char *fmt, ...) { va_list argptr; char msg[MAXPRINTMSG]; static qboolean inupdate; va_start (argptr,fmt); vsprintf (msg,fmt,argptr); va_end (argptr); // also echo to debugging console Sys_Printf ("%s", msg); // also echo to debugging console // log all messages to file if (con_debuglog) Sys_DebugLog(va("%s/qconsole.log",com_gamedir), "%s", msg); if (!con_initialized) return; // write it to the scrollable buffer Con_Print (msg); // update the screen immediately if the console is displayed if (cls.state != ca_active) { // protect against infinite loop if something in SCR_UpdateScreen calls // Con_Printd if (!inupdate) { inupdate = true; //SCR_UpdateScreen (); inupdate = false; } } }
void Engine_InitAL() { #if !NO_AUDIO ALCint paramList[] = { ALC_STEREO_SOURCES, TR_AUDIO_STREAM_NUMSOURCES, ALC_MONO_SOURCES, (TR_AUDIO_MAX_CHANNELS - TR_AUDIO_STREAM_NUMSOURCES), ALC_FREQUENCY, 44100, 0 }; Sys_DebugLog(LOG_FILENAME, "Probing OpenAL devices..."); const char *devlist = alcGetString(nullptr, ALC_DEVICE_SPECIFIER); if (!devlist) { Sys_DebugLog(LOG_FILENAME, "InitAL: No AL audio devices!"); return; } while(*devlist) { Sys_DebugLog(LOG_FILENAME, " Device: %s", devlist); ALCdevice* dev = alcOpenDevice(devlist); if(audio_settings.use_effects) { if( alcIsExtensionPresent(dev, ALC_EXT_EFX_NAME) == ALC_TRUE ) { Sys_DebugLog(LOG_FILENAME, " EFX supported!"); al_device = dev; break; } else { alcCloseDevice(dev); devlist += std::strlen(devlist)+1; } } else { al_device = dev; break; } } al_context = alcCreateContext(al_device, paramList); if(!al_context) { Sys_DebugLog(LOG_FILENAME, " Failed to create OpenAL context."); alcCloseDevice(al_device); al_device = nullptr; return; } alcMakeContextCurrent(al_context); Audio_LoadALExtFunctions(al_device); std::string driver = "OpenAL library: "; driver += alcGetString(al_device, ALC_DEVICE_SPECIFIER); ConsoleInfo::instance().addLine(driver, FONTSTYLE_CONSOLE_INFO); alSpeedOfSound(330.0 * 512.0); alDopplerVelocity(330.0 * 510.0); alDistanceModel(AL_LINEAR_DISTANCE_CLAMPED); #endif }
void Engine_InitSDLVideo() { Uint32 video_flags = SDL_WINDOW_OPENGL | SDL_WINDOW_MOUSE_FOCUS | SDL_WINDOW_INPUT_FOCUS; if(screen_info.FS_flag) { video_flags |= SDL_WINDOW_FULLSCREEN; } else { video_flags |= (SDL_WINDOW_RESIZABLE | SDL_WINDOW_SHOWN); } ///@TODO: is it really needede for correct work? if(SDL_GL_LoadLibrary(NULL) < 0) { Sys_Error("Could not init OpenGL driver"); } // Check for correct number of antialias samples. if(renderer.settings().antialias) { /* Request opengl 3.2 context. */ SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); /* I do not know why, but settings of this temporary window (zero position / size) are applied to the main window, ignoring screen settings */ sdl_window = SDL_CreateWindow(NULL, screen_info.x, screen_info.y, screen_info.w, screen_info.h, SDL_WINDOW_OPENGL | SDL_WINDOW_HIDDEN); sdl_gl_context = SDL_GL_CreateContext(sdl_window); SDL_GL_MakeCurrent(sdl_window, sdl_gl_context); GLint maxSamples = 0; glGetIntegerv(GL_MAX_SAMPLES, &maxSamples); maxSamples = (maxSamples > 16)?(16):(maxSamples); // Fix for faulty GL max. sample number. if(renderer.settings().antialias_samples > maxSamples) { if(maxSamples == 0) { renderer.settings().antialias = 0; renderer.settings().antialias_samples = 0; Sys_DebugLog(LOG_FILENAME, "InitSDLVideo: can't use antialiasing"); } else { renderer.settings().antialias_samples = maxSamples; // Limit to max. Sys_DebugLog(LOG_FILENAME, "InitSDLVideo: wrong AA sample number, using %d", maxSamples); } } SDL_GL_DeleteContext(sdl_gl_context); SDL_DestroyWindow(sdl_window); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, renderer.settings().antialias); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, renderer.settings().antialias_samples); } else { SDL_GL_SetAttribute(SDL_GL_MULTISAMPLEBUFFERS, 0); SDL_GL_SetAttribute(SDL_GL_MULTISAMPLESAMPLES, 0); } SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, renderer.settings().z_depth); #if STENCIL_FRUSTUM SDL_GL_SetAttribute(SDL_GL_STENCIL_SIZE, 8); #endif // set the opengl context version SDL_GL_SetAttribute(SDL_GL_CONTEXT_PROFILE_MASK, SDL_GL_CONTEXT_PROFILE_CORE); SDL_GL_SetAttribute(SDL_GL_ACCELERATED_VISUAL, 1); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MAJOR_VERSION, 3); SDL_GL_SetAttribute(SDL_GL_CONTEXT_MINOR_VERSION, 2); sdl_window = SDL_CreateWindow("OpenTomb", screen_info.x, screen_info.y, screen_info.w, screen_info.h, video_flags); sdl_gl_context = SDL_GL_CreateContext(sdl_window); assert(sdl_gl_context); SDL_GL_MakeCurrent(sdl_window, sdl_gl_context); ConsoleInfo::instance().addLine((const char*)glGetString(GL_VENDOR), FONTSTYLE_CONSOLE_INFO); ConsoleInfo::instance().addLine((const char*)glGetString(GL_RENDERER), FONTSTYLE_CONSOLE_INFO); std::string version = "OpenGL version "; version += (const char*)glGetString(GL_VERSION); ConsoleInfo::instance().addLine(version, FONTSTYLE_CONSOLE_INFO); ConsoleInfo::instance().addLine((const char*)glGetString(GL_SHADING_LANGUAGE_VERSION), FONTSTYLE_CONSOLE_INFO); }
void Engine_InitSDLControls() { int NumJoysticks; Uint32 init_flags = SDL_INIT_VIDEO | SDL_INIT_EVENTS; // These flags are used in any case. if(control_mapper.use_joy == 1) { init_flags |= SDL_INIT_GAMECONTROLLER; // Update init flags for joystick. if(control_mapper.joy_rumble) { init_flags |= SDL_INIT_HAPTIC; // Update init flags for force feedback. } SDL_Init(init_flags); NumJoysticks = SDL_NumJoysticks(); if((NumJoysticks < 1) || ((NumJoysticks - 1) < control_mapper.joy_number)) { Sys_DebugLog(LOG_FILENAME, "Error: there is no joystick #%d present.", control_mapper.joy_number); return; } if(SDL_IsGameController(control_mapper.joy_number)) // If joystick has mapping (e.g. X360 controller) { SDL_GameControllerEventState(SDL_ENABLE); // Use GameController API sdl_controller = SDL_GameControllerOpen(control_mapper.joy_number); if(!sdl_controller) { Sys_DebugLog(LOG_FILENAME, "Error: can't open game controller #%d.", control_mapper.joy_number); SDL_GameControllerEventState(SDL_DISABLE); // If controller init failed, close state. control_mapper.use_joy = 0; } else if(control_mapper.joy_rumble) // Create force feedback interface. { sdl_haptic = SDL_HapticOpenFromJoystick(SDL_GameControllerGetJoystick(sdl_controller)); if(!sdl_haptic) { Sys_DebugLog(LOG_FILENAME, "Error: can't initialize haptic from game controller #%d.", control_mapper.joy_number); } } } else { SDL_JoystickEventState(SDL_ENABLE); // If joystick isn't mapped, use generic API. sdl_joystick = SDL_JoystickOpen(control_mapper.joy_number); if(!sdl_joystick) { Sys_DebugLog(LOG_FILENAME, "Error: can't open joystick #%d.", control_mapper.joy_number); SDL_JoystickEventState(SDL_DISABLE); // If joystick init failed, close state. control_mapper.use_joy = 0; } else if(control_mapper.joy_rumble) // Create force feedback interface. { sdl_haptic = SDL_HapticOpenFromJoystick(sdl_joystick); if(!sdl_haptic) { Sys_DebugLog(LOG_FILENAME, "Error: can't initialize haptic from joystick #%d.", control_mapper.joy_number); } } } if(sdl_haptic) // To check if force feedback is working or not. { SDL_HapticRumbleInit(sdl_haptic); SDL_HapticRumblePlay(sdl_haptic, 1.0, 300); } } else { SDL_Init(init_flags); } }