summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLudovic Pouzenc <lpouzenc@gmail.com>2013-07-24 00:04:31 +0200
committerLudovic Pouzenc <lpouzenc@gmail.com>2013-07-24 00:04:31 +0200
commit9d4669bff0e2979bf598067c8efad50e2ea731f2 (patch)
tree5820700bae6e008ae035047c4ed247b17181cc8b
parentcbb47fe9dadd8e61cb082e39b12e96cf2614a94c (diff)
downloadmplemmings-9d4669bff0e2979bf598067c8efad50e2ea731f2.tar.gz
mplemmings-9d4669bff0e2979bf598067c8efad50e2ea731f2.tar.bz2
mplemmings-9d4669bff0e2979bf598067c8efad50e2ea731f2.zip
Chargement des fichiers Ini géré dans module loader à présent.
-rw-r--r--src/include/data_ini.h9
-rw-r--r--src/include/loader.h13
-rw-r--r--src/loader.c64
-rw-r--r--src/test/testrender.c68
4 files changed, 83 insertions, 71 deletions
diff --git a/src/include/data_ini.h b/src/include/data_ini.h
index 1f93caf..722581f 100644
--- a/src/include/data_ini.h
+++ b/src/include/data_ini.h
@@ -2,12 +2,15 @@
#define DATA_INI_H
#include <SDL_stdinc.h>
+#include "utils.h" /* MAX_PATH_LEN */
#define LEVEL_WIDTH (1664*2)
#define LEVEL_HEIGHT (160*2)
#define MAX_NAMELEN 64
+#define MAX_LEVELPACK_COUNT 8
+
#define MAX_PARTICLE_COLORS 16
#define MAX_MUSICS_COUNT 32
#define MAX_DIFFICULTY_COUNT 8
@@ -44,6 +47,7 @@ struct levelIni {
//////////////////////// LEVELPACK INI FILES ////////////////////////
struct levelPackIni {
+ char id[MAX_NAMELEN];
char name[MAX_NAMELEN];
int maxFallDistance;
char codeSeed[MAX_NAMELEN];
@@ -82,9 +86,10 @@ struct miscIni {
//////////////////////// GLOBAL INI FILES ////////////////////////
typedef struct {
- struct styleIni style;
- struct levelIni level;
+ char data_basepath[MAX_PATH_LEN];
struct levelPackIni levelPack;
+ struct levelIni level;
+ struct styleIni style;
//struct miscIni misc;
} gameIni_t;
diff --git a/src/include/loader.h b/src/include/loader.h
index febd48e..4dd6e79 100644
--- a/src/include/loader.h
+++ b/src/include/loader.h
@@ -4,13 +4,14 @@
#include "data_ini.h"
#include "data_ress.h"
+#include "parser.h"
-/* Load all textures needed for style from gIni */
-int loadStyleRes(SDL_Renderer *rend, gameIni_t *gIni, char data_basepath[], gameRess_t *gRess);
-void unloadStyleRes(gameRess_t *gRess);
+int loadLevel(char data_basepath[], char packId[], char levelId[], gameIni_t *gIni);
+void unloadLevel(gameIni_t *gIni, gameRess_t *gRess);
-/* Load all misc textures (lemmings, fonts, cursor...) */
-int loadMiscRes(SDL_Renderer *rend, char data_basepath[], gameRess_t *gRess);
-void unloadMiscRes(gameRess_t *gRess);
+int loadStyleRes(SDL_Renderer *rend, gameIni_t *gIni, gameRess_t *gRess);
+int loadMiscRes (SDL_Renderer *rend, gameIni_t *gIni, gameRess_t *gRess);
+void unloadStyleRes(gameRess_t *gRess);
+void unloadMiscRes (gameRess_t *gRess);
#endif /*LOADER_H*/
diff --git a/src/loader.c b/src/loader.c
index f780ae9..fdf2a6e 100644
--- a/src/loader.c
+++ b/src/loader.c
@@ -6,25 +6,64 @@
int loadSprite(SDL_Renderer *rend, char *giffilepath, int frames, sprite_t *sprite);
int loadSurface(SDL_Renderer *rend, char *giffilepath, SDL_Surface **surf);
-int loadStyleRes(SDL_Renderer *rend, gameIni_t *gIni, char data_basepath[], gameRess_t *gRess) {
+int loadLevel(char data_basepath[], char packId[], char levelId[], gameIni_t *gIni) {
+ int res;
+ char filepath[MAX_PATH_LEN];
+
+ SDL_strlcpy(gIni->data_basepath, data_basepath, MAX_PATH_LEN);
+
+ SDL_snprintf(filepath, MAX_PATH_LEN, "%s/level/%s/levelpack.ini", data_basepath, packId);
+ res=loadIni(ini_levelpack, filepath, gIni);
+ if (res!=0) return res;
+
+ SDL_strlcpy(gIni->levelPack.id, packId, MAX_NAMELEN);
+
+ SDL_snprintf(filepath, MAX_PATH_LEN, "%s/level/%s/%s.ini", gIni->data_basepath, packId, levelId);
+ res=loadIni(ini_level, filepath, gIni);
+ if (res!=0) return res;
+
+ // Check if we found a "style =" line in level ini file
+ MPL_CHECK(
+ gIni->level.style[0] != '\0',
+ { return 10; },
+ 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", gIni->data_basepath, gIni->level.style, gIni->level.style);
+ res=loadIni(ini_style, filepath, gIni);
+ if (res!=0) return res;
+
+
+ return 0;
+}
+
+
+void unloadLevel(gameIni_t *gIni, gameRess_t *gRess) {
+ //FIXME Not yet implemented
+}
+
+/* Load all textures needed for style from gIni */
+int loadStyleRes(SDL_Renderer *rend, gameIni_t *gIni, gameRess_t *gRess) {
int i, res;
char filepath[MAX_PATH_LEN+1];
char *stylename=gIni->level.style;
for(i=0; i < gIni->style.tiles; i++) {
- (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/style/%s/%s_%d.gif", data_basepath, stylename, stylename, i);
+ (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/style/%s/%s_%d.gif", gIni->data_basepath, stylename, stylename, i);
res=loadSurface(rend,filepath,&gRess->tiles[i]);
if (res != 0) return res;
}
for(i=0; i < gIni->style.objectCount; i++) {
- (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/style/%s/%so_%d.gif", data_basepath, stylename, stylename, i);
+ (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/style/%s/%so_%d.gif", gIni->data_basepath, stylename, stylename, i);
res=loadSprite(rend,filepath,gIni->style.frames[i],&gRess->objects[i]);
if (res != 0) return res;
/* Some object types needs a mask */
if ( gIni->style.type[i] >= 5 && gIni->style.type[i] <= 8 ) {
- (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/style/%s/%som_%d.gif", data_basepath, stylename, stylename, i);
+ (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/style/%s/%som_%d.gif", gIni->data_basepath, stylename, stylename, i);
res=loadSurface(rend,filepath,&gRess->objectMasks[i]);
if (res != 0) return res;
}
@@ -46,7 +85,8 @@ void unloadStyleRes(gameRess_t *gRess) {
}
}
-int loadMiscRes(SDL_Renderer *rend, char data_basepath[], gameRess_t *gRess) {
+/* Load all misc textures (lemmings, fonts, cursor...) */
+int loadMiscRes(SDL_Renderer *rend, gameIni_t *gIni, gameRess_t *gRess) {
int lemmanim_frames[MAX_LEMMANIM_COUNT] = {8,4,8,8,10,16,16,16,14,8,16,16,8,16,32,24,4};
int lemmanim_hasmask[6] = {6,10,11,13,14,15};
@@ -56,38 +96,38 @@ int loadMiscRes(SDL_Renderer *rend, char data_basepath[], gameRess_t *gRess) {
int i,ii,res;
for(i=0; i<MAX_LEMMANIM_COUNT; i++) {
- (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/lemm_%d.gif", data_basepath, i);
+ (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/lemm_%d.gif", gIni->data_basepath, i);
res=loadSprite(rend,filepath,lemmanim_frames[i],&gRess->lemmingAnims[i]);
if (res != 0) return res;
}
for(ii=0; ii<6; ii++) {
i=lemmanim_hasmask[ii];
- (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/mask_%d.gif", data_basepath, i);
+ (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/mask_%d.gif", gIni->data_basepath, i);
res=loadSurface(rend,filepath,&gRess->lemmingMasks[i]);
if (res != 0) return res;
}
for(ii=0; ii<3; ii++) {
i=lemmanim_hasimask[ii];
- (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/imask_%d.gif", data_basepath, i);
+ (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/imask_%d.gif", gIni->data_basepath, i);
res=loadSurface(rend,filepath,&gRess->lemmingIMasks[i]);
if (res != 0) return res;
}
- (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/cursor.gif", data_basepath);
+ (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/cursor.gif", gIni->data_basepath);
res=loadSprite(rend,filepath,8,&gRess->cursor);
if (res != 0) return res;
- (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/countdown.gif", data_basepath);
+ (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/countdown.gif", gIni->data_basepath);
res=loadSprite(rend,filepath,5,&gRess->countdown);
if (res != 0) return res;
- (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/lemmfont.gif", data_basepath);
+ (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/lemmfont.gif", gIni->data_basepath);
res=loadSprite(rend,filepath,94,&gRess->font1);
if (res != 0) return res;
- (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/lemmfont2.gif", data_basepath);
+ (void) SDL_snprintf(filepath, MAX_PATH_LEN, "%s/misc/lemmfont2.gif", gIni->data_basepath);
res=loadSprite(rend,filepath,94,&gRess->font2);
if (res != 0) return res;
diff --git a/src/test/testrender.c b/src/test/testrender.c
index 5ec71d7..a8fba18 100644
--- a/src/test/testrender.c
+++ b/src/test/testrender.c
@@ -1,7 +1,6 @@
#include "gameui.h"
#include "graphic.h"
#include "loader.h"
-#include "parser.h"
#include "utils.h"
#define DATA_BASEPATH "./data"
@@ -10,76 +9,43 @@
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];
+ SDL_Window *win;
+ SDL_Renderer *rend;
+ SDL_RendererInfo rendInfo;
+ SDL_Rect viewport;
+ SDL_Event uiEvent;
+
+ int res, 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;
if (argc != 3) {
fprintf(stderr, "Usage %s <levelpack_name> <level_ini_name>\n", argv[0]);
return 1;
}
- // Setting default values
+ /* 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);
+ res=loadLevel(DATA_BASEPATH, argv[1], argv[2], &gIni);
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=loadMiscRes(rend, &gIni, &gRess); if (res!=0) exit(res);
+ res=loadStyleRes(rend, &gIni, &gRess); if (res!=0) exit(res);
- res=paintTerrain(&gIni, &gRess, &gState);
- if (res!=0) exit(res);
+ res=paintTerrain(&gIni, &gRess, &gState); if (res!=0) exit(res);
gState.renderListSize=buildTestRL(&gRess, MAX_RENDERLIST_LEN, gState.renderList);