# HG changeset patch # User Matti Hamalainen # Date 1348885877 -10800 # Node ID b3d6670c432452e2beb8d8ebfd02e99e2f82ec12 # Parent 2ff53bcfe3667ab68d7793fa8fda74f0c8eeb7b2 Use new resource management system. diff -r 2ff53bcfe366 -r b3d6670c4324 krapula.c --- a/krapula.c Fri Sep 28 10:59:05 2012 +0300 +++ b/krapula.c Sat Sep 29 05:31:17 2012 +0300 @@ -13,29 +13,6 @@ #define DM_COLORS (256) -static BOOL dmDoLoadImage(SDL_Surface **img, const char *fname) -{ - DMResource *file = dmf_open(fname); - if (file == NULL) - return FALSE; - - if ((*img = dmLoadImage(file)) == NULL) - { - dmf_close(file); - return FALSE; - } - - dmf_close(file); - return TRUE; -} - -#define LOADIMAGE(img, fname) \ - do { \ - if (!dmDoLoadImage(&(img), fname)) \ - goto error_exit; \ - } while (0) - - typedef struct { @@ -437,7 +414,7 @@ } -void dmAudioCallback(void *userdata, Uint8 *stream, int len) +void engineAudioCallback(void *userdata, Uint8 *stream, int len) { JSSMixer *d = (JSSMixer *) userdata; @@ -484,15 +461,11 @@ const int ncredits = sizeof(credits) / sizeof(credits[0]); + + DMEngineData engine; DMFrameData frame; -SDL_Surface *nosfe[NOSFE_MAX - NOSFE_MIN + 1]; - -SDL_Surface *logobg, *logolayer1, *logolayer2, - *anciat, *gay, *ruutu, *greets; - - int engineGetTick() { return (frame.startTime - engine.startTime) + DEBUG * 1000; @@ -525,6 +498,86 @@ int dmScaledBlitSurface32to32TransparentX(SDL_Surface *src, const int x0, const int y0, const int dwidth, const int dheight, SDL_Surface *dst); +int engineResImageLoad(DMResource *res) +{ + SDL_Surface *img = dmLoadImage(res); + if (res != NULL) + { + res->rdata = img; + return DMERR_OK; + } + else + return dmferror(res); +} + +void engineResImageFree(DMResource *res) +{ + SDL_FreeSurface((SDL_Surface *)res->rdata); +} + +int engineResModuleLoad(DMResource *res) +{ + return jssLoadXM(res, (JSSModule **) &(res->rdata)); +} + +void engineResModuleFree(DMResource *res) +{ + jssFreeModule((JSSModule *) res->rdata); +} + + +static DMResourceDataOps engineResImage = +{ + engineResImageLoad, + engineResImageFree +}; + +static DMResourceDataOps engineResModule = +{ + engineResModuleLoad, + engineResModuleFree +}; + + +int engineClassifier(DMResource *res) +{ + DMResourceDataOps *rops = NULL; + char *fext; + + if (res == NULL) + return DMERR_NULLPTR; + + if ((fext = strrchr(res->filename, '.')) != NULL) + { + if (strcasecmp(fext, ".png") == 0 || strcasecmp(fext, ".jpg") == 0) + rops = &engineResImage; + else + if (strcasecmp(fext, ".xm") == 0 || strcasecmp(fext, ".jmod") == 0) + rops = &engineResModule; + } + + res->rops = rops; + + return DMERR_OK; +} + + +void *engineGetResource(const char *name) +{ + DMResource *res = dmres_find(name); + if (res != NULL && res->rdata != NULL) + return res->rdata; + else + { + dmError("Could not find resource '%s'.\n", name); + return NULL; + } +} + + +#define engineGetResImage(name) (SDL_Surface *) engineGetResource(name) +#define engineGetResModule(name) (JSSModule *) engineGetResource(name) + int main(int argc, char *argv[]) { @@ -532,8 +585,7 @@ JSSModule *mod = NULL; JSSMixer *dev = NULL; JSSPlayer *plr = NULL; - int err, i; - DMResource *tfile; + int err, i, loaded, total; SDL_AudioSpec *a_desired = NULL, *a_obtained = NULL; memset(&frame, 0, sizeof(frame)); @@ -549,61 +601,14 @@ dmPrint(0, "TNSP PIERUPASKA engine 2012 'passeli professional' loading.\n"); // Open packfs - if ((err = dmres_init("orvellys.dat", NULL, DRF_USE_PACK)) != DMERR_OK) + if ((err = dmres_init("orvellys.dat", NULL, DRF_USE_PACK | DRF_PRELOAD_RES, engineClassifier)) != DMERR_OK) { - dmError("Could not initialize PACKFS: %d, %s.\n", err, dmErrorStr(err)); + dmError("Could not initialize resource manager: %d, %s.\n", err, dmErrorStr(err)); goto error_exit; } - dmMsg(0, "miniJSS audio kyrpe XD\n"); jssInit(); - - // Dataa - dmPrint(0, "cachetaan motion jpeg videota (blz wait) .."); - for (i = 0; i < NOSFE_MAX; i++) - { - char fname[64]; - snprintf(fname, sizeof(fname), "%08d.jpg", NOSFE_MIN + i); - dmPrint(0, "."); - - if (!dmDoLoadImage(&nosfe[i], fname)) - { - dmError("Error uncompressing motion jpeg video.\n"); - goto error_exit; - } - } - dmPrint(0,"ok\n"); - - dmPrint(0, "ogei, loput resurssit .."); - LOADIMAGE(logobg, "logobg.png"); - LOADIMAGE(logolayer1, "logolayer1.png"); - LOADIMAGE(logolayer2, "logolayer2.png"); - LOADIMAGE(anciat, "anciat.png"); - LOADIMAGE(gay, "gay.png"); - LOADIMAGE(ruutu, "ruutu.png"); - LOADIMAGE(greets, "greetings.png"); - - for (i = 0; i < ncredits; i++) - LOADIMAGE(credits[i].img, credits[i].filename); - - dmPrint(0, "joo\n"); - - if ((tfile = dmf_open("krapula.xm")) == NULL) - { - dmError("EI VOINU MUSSIIKKIA LADATA!!!\n"); - goto error_exit; - } - - err = jssLoadXM(tfile, &mod); - dmf_close(tfile); - if (err != DMERR_OK) - { - dmError("Joasdfok XM motuuli ei?? %d\n", err); - goto error_exit; - } - - // Initialize SDL components if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) != 0) { @@ -622,7 +627,7 @@ return 3; } - a_desired->freq = 48000; + a_desired->freq = 44100; a_desired->format = AUDIO_S16SYS; a_desired->channels = 2; @@ -637,7 +642,7 @@ } a_desired->samples = 16*1024; - a_desired->callback = dmAudioCallback; + a_desired->callback = engineAudioCallback; a_desired->userdata = (void *) dev; /* Open the audio device */ @@ -670,33 +675,79 @@ goto error_exit; } - /* Set callback, init module */ - jvmSetCallback(dev, jmpExec, plr); - jmpSetModule(plr, mod); - jmpPlayOrder(plr, 0); - jvmSetGlobalVol(dev, 55); - + // Joo if (!dmInitializeVideo(&engine.screen)) goto error_exit; SDL_WM_SetCaption(dmProgDesc, dmProgName); + + // Load resources + err = dmres_preload(TRUE, &loaded, &total); + while ((err = dmres_preload(FALSE, &loaded, &total)) == DMERR_PROGRESS) + { + if (total > 0 && (loaded % 2) == 0) + { + if (SDL_MUSTLOCK(engine.screen) != 0 && SDL_LockSurface(engine.screen) != 0) + { + dmError("Can't lock surface.\n"); + goto error_exit; + } + + dmClearSurface(engine.screen, dmMapRGBA(engine.screen, 0,0,0,0)); + + dmFillRect(engine.screen, 50, 220, 550, 240, dmMapRGB(engine.screen, 255,255,255)); + dmFillRect(engine.screen, 51, 221, 549, 239, dmMapRGB(engine.screen, 0,0,0)); + + if (total > 0) + { + dmFillRect(engine.screen, 53, 223, + 53 + (547 - 53) * (float) loaded / (float) total, + 237, dmMapRGB(engine.screen, 200,200,200)); + } + + // Flip screen + if (SDL_MUSTLOCK(engine.screen) != 0) + SDL_UnlockSurface(engine.screen); + + SDL_Flip(engine.screen); + } + } + if (err != DMERR_OK) + { + dmError("Error loading resources, %d: %s.\n", + err, dmErrorStr(err)); + goto error_exit; + } + // efut dmPerlinInit(); + SDL_Surface *nosfe[NOSFE_MAX - NOSFE_MIN + 1]; + for (i = 0; i < NOSFE_MAX; i++) + { + char fname[64]; + snprintf(fname, sizeof(fname), "%08d.jpg", NOSFE_MIN + i); + nosfe[i] = engineGetResImage(fname); + } + + for (i = 0; i < ncredits; i++) + credits[i].img = engineGetResImage(credits[i].filename); SDL_Surface *bmap = SDL_CreateRGBSurface(SDL_SWSURFACE, QWIDTH, QHEIGHT, 8, 0, 0, 0, 0); + /* Set callback, init module */ + jvmSetCallback(dev, jmpExec, plr); + jmpSetModule(plr, engineGetResModule("krapula.xm")); + jmpPlayOrder(plr, 0); + jvmSetGlobalVol(dev, 55); + SDL_PauseAudio(0); - dmMsg(0, "We are go.\n"); - SDL_PauseAudio(0); engine.startTime = SDL_GetTicks(); - while (!engine.exitFlag) { - while (SDL_PollEvent(&engine.event)) switch (engine.event.type) { @@ -748,6 +799,7 @@ if (t < 5) { + SDL_Surface *anciat; int dt = engineGetTime(0); static DMLerpContext lerpX, lerpY, lerpD; static DMScaledBlitFunc nblit; @@ -755,6 +807,7 @@ static BOOL nollattu = FALSE; if (!nollattu) { + anciat = engineGetResImage("anciat.png"); nblit = dmGetScaledBlitFunc(bmap->format, engine.screen->format, DMD_NONE); dmMakePalette(bmap); dmLerpInit(&lerpX, 0, QWIDTH, 5000); @@ -773,6 +826,7 @@ else if (t < 10) { + SDL_Surface *logobg, *logolayer1, *logolayer2; int dt = engineGetTime(5); static DMScaledBlitFunc nblit, kblit; static DMLerpContext lerpD; @@ -780,6 +834,10 @@ if (!nollattu) { + logobg = engineGetResImage("logobg.png"); + logolayer1 = engineGetResImage("logolayer1.png"); + logolayer2 = engineGetResImage("logolayer2.png"); + nblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT); kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_NONE); dmLerpInit(&lerpD, 0.01, 500, 10000); @@ -802,6 +860,7 @@ else if (t < 20) { + SDL_Surface *gay, *logobg; int dt = engineGetTime(10); static DMLerpContext lerpX, lerpY, lerpD; static DMScaledBlitFunc nblit, kblit; @@ -811,6 +870,8 @@ if (!nollattu) { + gay = engineGetResImage("gay.png"); + logobg = engineGetResImage("logobg.png"); nblit = dmGetScaledBlitFunc(bmap->format, engine.screen->format, DMD_NONE); kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT); dmMakePalette(bmap); @@ -838,6 +899,7 @@ else if (t < 45) { + SDL_Surface *ruutu; static int currState, currCredit, creditStartTime; static DMLerpContext lerpX, lerpY, lerpZ; static DMScaledBlitFunc nblit, kblit; @@ -845,6 +907,7 @@ int currFrame = engineGetTime(20) * 15 / 1000; if (!nollattu) { + ruutu = engineGetResImage("ruutu.png"); dmClearSurface(ruutu, dmMapRGBA(ruutu, 0,0,0,0)); nblit = dmGetScaledBlitFunc(nosfe[0]->format, engine.screen->format, DMD_NONE); kblit = dmGetScaledBlitFunc(credits[0].img->format, engine.screen->format, DMD_TRANSPARENT); @@ -939,6 +1002,7 @@ else if (t < 60) { + SDL_Surface *logobg, *greets; int dt = engineGetTime(45); static DMScaledBlitFunc nblit, kblit; static DMLerpContext lerpD; @@ -946,6 +1010,8 @@ if (!nollattu) { + logobg = engineGetResImage("logobg.png"); + greets = engineGetResImage("greetings.png"); nblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_TRANSPARENT); kblit = dmGetScaledBlitFunc(logobg->format, engine.screen->format, DMD_NONE); dmLerpInit(&lerpD, 0.01, 500, 10000); @@ -969,8 +1035,9 @@ SDL_Flip(engine.screen); SDL_Delay(20); + + // Get frame time, etc frame.endTime = SDL_GetTicks(); - engine.currFrame++; engine.totalFrameTime += frame.endTime - frame.startTime; }