summaryrefslogtreecommitdiff
path: root/src/test/testplay.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/test/testplay.c')
-rw-r--r--src/test/testplay.c152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/test/testplay.c b/src/test/testplay.c
new file mode 100644
index 0000000..4ade8df
--- /dev/null
+++ b/src/test/testplay.c
@@ -0,0 +1,152 @@
+#include "gameui.h"
+#include "graphic.h"
+#include "loader.h"
+#include "utils.h"
+
+#define DATA_BASEPATH "./data"
+
+int main(int argc, char **argv) {
+ gameIni_t gIni;
+ gameRess_t gRess;
+ gameState_t gState;
+
+ SDL_Window *win;
+ SDL_Renderer *rend;
+ SDL_RendererInfo rendInfo;
+ SDL_Rect viewport;
+ SDL_Event uiEvent;
+
+ int res, mainLoopEnd, uiTick;
+
+ Uint32 initFlags = SDL_INIT_TIMER|SDL_INIT_VIDEO;
+ Uint32 winFlags = SDL_WINDOW_SHOWN;
+ Uint32 rendFlags = SDL_RENDERER_ACCELERATED; // | SDL_RENDERER_PRESENTVSYNC;
+ SDL_Rect winPos = {
+ .x=SDL_WINDOWPOS_UNDEFINED,
+ .y=SDL_WINDOWPOS_UNDEFINED,
+ .w=MPL_WIN_W,
+ .h=MPL_WIN_H
+ };
+
+ if (argc != 3) {
+ fprintf(stderr, "Usage %s <levelpack_name> <level_ini_name>\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));
+
+ res=loadLevel(DATA_BASEPATH, argv[1], argv[2], &gIni);
+ if (res!=0) exit(res);
+
+ res=mySDLInit(__FILE__, winPos, initFlags, winFlags, rendFlags, &win, &rend, &rendInfo, &viewport);
+ if (res!=0) exit(res);
+
+ res=loadMiscRes (rend, &gIni, &gRess); if (res!=0) exit(res);
+ res=loadStyleRes(rend, &gIni, &gRess); if (res!=0) exit(res);
+
+ res=setInitialState(&gIni, &gState); if (res!=0) exit(res);
+ res=paintTerrain(&gIni, &gRess, &gState); if (res!=0) exit(res);
+ res=renderTerrainToTexture(rend, &gState); if (res!=0) exit(res);
+ res=buildRenderList(&gIni, &gRess, &gState); if (res!=0) exit(res);
+
+ /* Main render loop */
+ uiTick = 0;
+ mainLoopEnd = 0;
+ while (!mainLoopEnd) {
+
+ /* Check for events */
+ while (SDL_PollEvent(&uiEvent)) {
+ if (uiEvent.type == SDL_QUIT) {
+ mainLoopEnd = 1;
+ }
+ }
+
+ (void) renderTerrainToTexture(rend, &gState);
+
+ SDL_RenderClear(rend);
+ (void) renderSprites(rend, &gState);
+ SDL_RenderPresent(rend);
+
+ if (uiTick % 4 == 0) {
+ int i;
+ gState.tick++;
+ for (i=0;i<gState.renderListSize;i++) {
+ renderItem_t *it = &gState.renderList[i];
+ if (it->animate==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) {
+ if (cur>1) curr_y += tmp_h;
+ curr_x = tmp_h = 0;
+ return cur;
+ } else if (curr_x >= 640) {
+ curr_x = 0;
+ curr_y += tmp_h;
+ tmp_h=0;
+ }
+ 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;
+ list[cur].absolute = 1;
+
+ 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++;
+
+ return cur;
+}
+
+int buildTestRL(gameRess_t *gRess, gameState_t *gState, int rlMaxLen, renderItem_t renderList[]) {
+ int i, rlLen;
+
+ rlLen=addRLitem(renderList, &gState->terrainSprite, rlMaxLen);
+ rlLen=addRLitem(renderList, NULL, rlMaxLen);
+
+ for (i=0; i<MAX_LEMMANIM_COUNT; i++) {
+ rlLen=addRLitem(renderList, &gRess->lemmingAnims[i], rlMaxLen);
+ }
+ rlLen=addRLitem(renderList, NULL, rlMaxLen);
+
+ for (i=0; i<MAX_OBJECTS_COUNT; i++) {
+ rlLen=addRLitem(renderList, &gRess->objects[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;
+}
+