void Engine::initializeSDL() { std::clog << "Initializing SDL...\n"; if (SDL_Init(SDL_INIT_VIDEO) < 0) { throw EngineError("Could not initialize SDL", SDL_GetError()); } /* Some video inforamtion */ const SDL_VideoInfo *info = SDL_GetVideoInfo(); if (!info) { throw EngineError("Video query failed", SDL_GetError()); } int screen_bpp = info->vfmt->BitsPerPixel; SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 8); SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 8); //SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16); SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1); SDL_GL_SetAttribute(SDL_GL_SWAP_CONTROL, 1); char env[] = "SDL_VIDEO_CENTERED=center"; SDL_putenv(env); int screen_flags = SDL_OPENGL; if (m_screenFull) screen_flags |= SDL_FULLSCREEN; std::clog << "Screen: " << m_screenWidth << "x" << m_screenHeight << "x" << screen_bpp << "\n"; // Screen surface SDL_Surface *screen = SDL_SetVideoMode(m_screenWidth, m_screenHeight, screen_bpp, screen_flags); if (!screen) { throw EngineError("Setting video mode failed", SDL_GetError()); } SDL_ShowCursor(SDL_DISABLE); SDL_EnableKeyRepeat(SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL); std::clog << "SDL initialized.\n"; }
static PackFile *PackOpenFromFile(char *name) { FILE *fp; PackFile *pack; int num, i; int packPtr = 0; fp = FOpen(name, "rb"); if (fp == NULL) { EngineError("not find %s\n", name); } pack = (PackFile *)Malloc(sizeof(PackFile)); fread(&num, sizeof(int), 1, fp); packPtr += sizeof(int); pack->file = (struct Data *)Malloc(sizeof(struct Data) * num); pack->num = num; for (i = 0; i < pack->num; i++) { struct Data *file = &pack->file[i]; fread(file->name, sizeof(char), MAX_PATH, fp); EncodeName(file->name, 0); packPtr += sizeof(char) * MAX_PATH; fread(&file->size, sizeof(int), 1, fp); packPtr += sizeof(int); file->ptr = packPtr; fseek(fp, file->ptr + file->size, SEEK_SET); packPtr += file->size; file->data = NULL; } FClose(fp); return pack; }
static int SbufNew() { int i; for (i = 0; i < MAX_SBUF_SIZE; i++) { if (!sbuf[i].busy) { return i; } } EngineError("sbuf error\n"); return -1; }
static char *PackRead(PackFile *pack, char *name, int *size, FILE *fp) { int i; if (!pack) { EngineError("not open pack file\n"); } for (i = 0; i < pack->num; i++) { struct Data *file = &pack->file[i]; if (!StrCmp(file->name, name)) { char *data; data = (char *)Malloc(sizeof(char) * file->size); fseek(fp, file->ptr, SEEK_SET); fread(data, sizeof(char), file->size, fp); EncodeBuf(data, file->size, 0); *size = file->size; WriteLog("read from pack file %s\n", name); return data; } } EngineError("not find %s\n", name); return NULL; }
char *LoadFile(char *name, int *size) { char *buf; buf = ReadFileBuf(name, size); if (buf != NULL) { WriteLog("load from file: %s\n", name); goto next; } buf = ReadFromPack(name, size); if (buf != NULL) { goto next; } EngineError("not find: %s\n", name); next: return buf; }