summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-07-24 13:47:53 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-07-24 13:47:53 +0200
commit77d83619a2225efce294b9698defb745e1dcefbd (patch)
treeab77a0987997bc39267f6ffd73d6ebaeccd3a7c7
parent1859688be9b7c27d1ca69fe0315dff93f464af5b (diff)
downloadmplemmings-77d83619a2225efce294b9698defb745e1dcefbd.tar.gz
mplemmings-77d83619a2225efce294b9698defb745e1dcefbd.tar.bz2
mplemmings-77d83619a2225efce294b9698defb745e1dcefbd.zip
Debut testplay et utilisation de gameui (bcp de choses à implémenter dedans !)
-rw-r--r--.gitignore1
-rw-r--r--Makefile.am8
-rw-r--r--src/gameui.c7
-rw-r--r--src/include/gameui.h2
-rw-r--r--src/test/testplay.c152
5 files changed, 167 insertions, 3 deletions
diff --git a/.gitignore b/.gitignore
index ba09d14..c2b750d 100644
--- a/.gitignore
+++ b/.gitignore
@@ -23,6 +23,7 @@ sbsprite
sbspritegif
testparseall
testrender
+testplay
# Temporaries and build objects
*.swp
diff --git a/Makefile.am b/Makefile.am
index e0d9669..4be3e49 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -4,12 +4,13 @@ ACLOCAL_AMFLAGS = -I m4 --install
bin_PROGRAMS = mplemmings mplemmings_ds
# Target list of programs that will not installed anywhere (dev helping tiny programs)
-noinst_PROGRAMS = sbmoose sbsprite sbspritegif testparseall testrender
+noinst_PROGRAMS = sbmoose sbsprite sbspritegif testparseall testrender testplay
# Use configure detected necessary cflags and ldflags
AM_CFLAGS = -Wall -Werror -I src/include/ -I src/minini/dev/ $(DEPS_CFLAGS)
LIBS = $(DEPS_LIBS)
-PARSER_MODULES=src/minini/dev/minIni.c src/minini/dev/my_SDL_stdinc.c src/parser.c
+PARSER_MODULES = src/minini/dev/minIni.c src/minini/dev/my_SDL_stdinc.c src/parser.c
+LOCALGAME_MODULES = $(PARSER_MODULES) src/loader.c src/graphic.c src/gameui.c
# Per target specs
mplemmings_SOURCES = src/mplemmings.c
@@ -19,7 +20,8 @@ sbmoose_SOURCES = src/sandbox/moose.c
sbsprite_SOURCES = src/sandbox/sprite.c
sbspritegif_SOURCES = src/sandbox/sprite_gif.c
testparseall_SOURCES = $(PARSER_MODULES) src/test/testparseall.c
-testrender_SOURCES = $(PARSER_MODULES) src/loader.c src/graphic.c src/gameui.c src/test/testrender.c
+testrender_SOURCES = $(LOCALGAME_MODULES) src/test/testrender.c
+testplay_SOURCES = $(LOCALGAME_MODULES) src/test/testplay.c
# Extra files to be shipped in the tarball (make dist)
EXTRA_DIST = m4/.dont-remove rm-all-generated-files.sh
diff --git a/src/gameui.c b/src/gameui.c
index e5d6164..4d8b417 100644
--- a/src/gameui.c
+++ b/src/gameui.c
@@ -1,8 +1,15 @@
#include "gameui.h"
+int setInitialState(gameIni_t *gIni, gameState_t *gState) {
+ gState->cameraX = gIni->level.xPos;
+ //FIXME : al lemmings states, skill counters...
+ return 0;
+}
+
int buildRenderList(gameIni_t *gIni, gameRess_t *gRess, gameState_t *gState) {
return -1; //FIXME : Not yet implemented
}
+
void disposeRenderList(gameState_t *gState) {
}
diff --git a/src/include/gameui.h b/src/include/gameui.h
index c9f607e..e36bc8c 100644
--- a/src/include/gameui.h
+++ b/src/include/gameui.h
@@ -6,6 +6,8 @@
#include "data_ress.h"
#include "data_game.h"
+int setInitialState(gameIni_t *gIni, gameState_t *gState);
+
/* Create list of all in-game sprite to render (for batch processing) */
int buildRenderList(gameIni_t *gIni, gameRess_t *gRess, gameState_t *gState);
void disposeRenderList(gameState_t *gState);
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;
+}
+