#include "gameui.h" #include "graphic.h" #include "loader.h" #include "parser.h" #include "utils.h" #define DATA_BASEPATH "./data" #define MAX_RENDERLIST_LEN 256 int buildTestRL(gameRess_t *gRess, int rlMaxLen, renderItem_t renderList[]); int main(int argc, char **argv) { int res; char filepath[MAX_PATH_LEN]; gameIni_t gIni; gameRess_t gRess; gameState_t gState; //renderItem_t renderList[MAX_RENDERLIST_LEN]; if (argc != 3) { fprintf(stderr, "Usage %s \n", argv[0]); return 1; } // Setting default values SDL_memset(&gIni,0,sizeof(gameIni_t)); SDL_memset(&gRess,0,sizeof(gameRess_t)); SDL_memset(&gState,0,sizeof(gameState_t)); // Loading levelpack.ini SDL_snprintf(filepath, MAX_PATH_LEN, "%s/level/%s/levelpack.ini", DATA_BASEPATH, argv[1]); res=loadIni(ini_levelpack, filepath, &gIni); if (res!=0) exit(res); // Loading lvl ini file SDL_snprintf(filepath, MAX_PATH_LEN, "%s/level/%s/%s.ini", DATA_BASEPATH, argv[1], argv[2]); res=loadIni(ini_level, filepath, &gIni); if (res!=0) exit(res); // Check if we found a "style =" line in level ini file MPL_CHECK( gIni.level.style[0] != '\0', { exit(1); }, SDL_LOG_PRIORITY_CRITICAL, "No valid style detected in level ini file" ); // Loading style ini file SDL_snprintf(filepath, MAX_PATH_LEN, "%s/style/%s/%s.ini", DATA_BASEPATH, gIni.level.style, gIni.level.style); res=loadIni(ini_style, filepath, &gIni); if (res!=0) exit(res); /* Loading misc/lemming.ini SDL_snprintf(filepath, MAX_PATH_LEN, "%s/lemming.ini", PATH_MISC); res=loadIni(&gIni, filepath); if (res!=0) exit(res); */ SDL_Window *win; SDL_Renderer *rend; SDL_RendererInfo rendInfo; SDL_Rect viewport; SDL_Event uiEvent; int mainLoopEnd, uiTick; SDL_Rect winPos = { .x=SDL_WINDOWPOS_UNDEFINED, .y=SDL_WINDOWPOS_UNDEFINED, .w=MPL_WIN_W, .h=MPL_WIN_H }; Uint32 initFlags = SDL_INIT_TIMER|SDL_INIT_VIDEO; Uint32 winFlags = SDL_WINDOW_SHOWN; Uint32 rendFlags = SDL_RENDERER_ACCELERATED; // | SDL_RENDERER_PRESENTVSYNC; res=mySDLInit(__FILE__, winPos, initFlags, winFlags, rendFlags, &win, &rend, &rendInfo, &viewport); if (res!=0) exit(res); res=loadMiscRes(rend, DATA_BASEPATH, &gRess); if (res!=0) exit(res); res=loadStyleRes(rend, &gIni, DATA_BASEPATH, &gRess); if (res!=0) exit(res); res=paintTerrain(&gIni, &gRess, &gState); if (res!=0) exit(res); gState.renderListSize=buildTestRL(&gRess, MAX_RENDERLIST_LEN, gState.renderList); gState.cameraX = gIni.level.xPos; /* Main render loop */ uiTick = 0; mainLoopEnd = 0; while (!mainLoopEnd) { int i; /* Check for events */ while (SDL_PollEvent(&uiEvent)) { if (uiEvent.type == SDL_QUIT) { mainLoopEnd = 1; } } SDL_RenderClear(rend); (void) renderTerrain(rend, &gState); (void) renderSprites(rend, &gState); SDL_RenderPresent(rend); if (uiTick % 4 == 0) { gState.tick++; for (i=0;ianimate==1) { it->currframe = (it->currframe + 1) % it->sprite->frames; } } } SDL_Delay(25); gState.cameraX = (gState.cameraX + 1) % (LEVEL_WIDTH - MPL_WIN_W); uiTick++; } disposeRenderList(&gState); unloadStyleRes(&gRess); unloadMiscRes(&gRess); SDL_DestroyRenderer(rend); SDL_DestroyWindow(win); SDL_Quit(); return 0; } int addRLitem(renderItem_t list[], sprite_t *it, int rlMaxLen) { static int cur=0, curr_x=0, curr_y=0, tmp_h=0; if (it == NULL) { curr_y += tmp_h; curr_x = tmp_h = 0; return cur; } if (cur > rlMaxLen || it->t == NULL) return cur; list[cur].sprite = it; list[cur].x = curr_x; list[cur].y = curr_y; list[cur].currframe = 0; if (it->frames > 1) { list[cur].animate = 1; /* By defaut, animate */ } curr_x += it->size.w + 1; if (tmp_h < it->size.h) tmp_h = it->size.h; cur++; if (curr_x >= 640) { curr_x = 0; curr_y += tmp_h; tmp_h=0; } return cur; } int buildTestRL(gameRess_t *gRess, int rlMaxLen, renderItem_t renderList[]) { int i, rlLen; for (i=0; ilemmingAnims[i], rlMaxLen); } rlLen=addRLitem(renderList, NULL, rlMaxLen); for (i=0; iobjects[i], rlMaxLen); } rlLen=addRLitem(renderList, NULL, rlMaxLen); rlLen=addRLitem(renderList, &gRess->font1, rlMaxLen); rlLen=addRLitem(renderList, &gRess->font2, rlMaxLen); rlLen=addRLitem(renderList, &gRess->countdown, rlMaxLen); rlLen=addRLitem(renderList, &gRess->cursor, rlMaxLen); return rlLen; }