aniType* mkAni(SDL_Surface*img, int w,int h, int ticksPerFrame) { if(!img) { return(NULL); } int numFrames = img->w/w; int i; aniType* ani = malloc( sizeof(aniType) ); memset( ani, 0, sizeof(aniType) ); ani->numFrames=numFrames; ani->numTicks=ticksPerFrame; ani->spr = malloc( sizeof(spriteType*) * numFrames ); for(i=0;i<numFrames;i++) { ani->spr[i] = cutSprite(img, i*w,0, w,h); } return(ani); }
void editorLoad(const char* fn, SDL_Surface* screen) { //Set filename editorFileName(fn); //Init cursor initCursor(&cur); //Read info's for level. pf.levelInfo = mkLevelInfo( fn ); //Load field loadField(&pf, fileName); initDraw(pf.levelInfo, screen); SDL_FreeSurface(stealGfxPtr()->boardImg); stealGfxPtr()->boardImg = loadImg( DATADIR"data/editbg.png" ); selBrickBG = loadImg( DATADIR"data/editselbrick.png" ); saveBtnBG = loadImg( DATADIR"data/edit-save.png" ); saveBtnSprite = cutSprite( saveBtnBG, 0,0, saveBtnBG->w, saveBtnBG->h ); changed=0; selBrick=BRICKSBEGIN; teleState=0; fieldRect.x = HSCREENW - 74; fieldRect.y = HSCREENH - 114; fieldRect.w = HSCREENW + 154; fieldRect.h = HSCREENH + 114; }
void drawPackBox(SDL_Surface* screen,int posx, int posy,int packNum) { char buf[128]; SDL_Rect r; r.x=posx+5; r.y=posy+5; //We do this so the menu can unload the images when not used. if(!ps.packBoxImg) { //Load graphics ps.packBoxImg = loadImg( "data/pack-box-small.png" ); ps.packBoxSpr[PCKLISTIMG_SELECTED] = cutSprite(ps.packBoxImg, 0,0,260,42); ps.packBoxSpr[PCKLISTIMG_DEFAULT] = cutSprite(ps.packBoxImg, 0,42,260,42); ps.packBoxSpr[PCKLISTIMG_IS_DLC] = cutSprite(ps.packBoxImg, 0,42+42,260,42); ps.packBoxSpr[PCKLISTIMG_DLC_ENTER] = cutSprite(ps.packBoxImg, 0,42+42+42,260,42); ps.packBoxSpr[PCKLISTIMG_DLC_OFFLINE] = cutSprite(ps.packBoxImg, 0,42+42+42+42,260,42); } SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "==== 10"); //PackInfo is now in pi. packInfoType* pi; if( packNum == ps.numPacks ) { pi = ps.dlc; } else { pi = (packInfoType*)( listGetItemAt(ps.packs,packNum) )->data; } //Blit the box if(pi == ps.dlc ) { #if defined( PLATFORM_SUPPORTS_STATSUPLOAD ) if( setting()->online && dlcGetState()==DLC_READY ) { drawSprite(screen, ps.packBoxSpr[PCKLISTIMG_DLC_ENTER], posx, posy); txtWrite(screen, FONTSMALL, STR_MENU_PACKLIST_DLC_ENTER, posx+40, posy+4); } else { drawSprite(screen, ps.packBoxSpr[PCKLISTIMG_DLC_OFFLINE], posx, posy); txtWrite(screen, FONTSMALL, STR_MENU_PACKLIST_DLC_OFFLINE, posx+12, posy+4); } #else drawSprite(screen, ps.packBoxSpr[PCKLISTIMG_DLC_OFFLINE], posx, posy); txtWrite(screen, FONTSMALL, STR_MENU_PACKLIST_DLC_OFFLINE, posx+12, posy+4); #endif return; //We don't want to write any info on that special box. } else if(ps.selected==packNum) { drawSprite(screen, ps.packBoxSpr[PCKLISTIMG_SELECTED], posx, posy); } else { if(pi->isDLC == PACK_IS_DLC) { drawSprite(screen, ps.packBoxSpr[PCKLISTIMG_IS_DLC], posx, posy); } else { drawSprite(screen, ps.packBoxSpr[PCKLISTIMG_DEFAULT], posx, posy); } } SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "==== 20"); //Blit the icon image SDL_BlitSurface(pi->icon,0,screen, &r); //PackName txtWrite(screen, FONTSMALL, pi->name, posx+40, posy+4); //Author txtWrite(screen, FONTSMALL, pi->author, posx+258-9*(strlen(pi->author)), posy+4); //Comment txtWrite(screen, FONTSMALL, pi->comment, posx+40, posy+4+12); //Number of levels sprintf(buf, "%i levels", pi->numLevels); txtWrite(screen, FONTSMALL, buf, posx+258-9*(strlen(buf)), posy+4+24); //Number of lives if( pi->lives > 0 ) { sprintf(buf, "%i lives", pi->lives); } else { sprintf(buf, "Infinite lives!"); } txtWrite(screen, FONTSMALL, buf, posx+40, posy+4+24); SDL_LogInfo(SDL_LOG_CATEGORY_APPLICATION, "==== 200"); }
int initDraw(levelInfo_t* li, SDL_Surface* screen) { char tempStr[512]; int i,x,y; //Background image graphics.boardImg = loadImg( packGetFile("themes",li->bgFile) ); if(!graphics.boardImg) { printf("Couldn't load board file:'%s'\n", packGetFile("themes",li->bgFile) ); cleanUpDraw(); return(0); } //Tileset sprintf(tempStr, "%s.png", li->tileBase); graphics.tileImg = loadImg( packGetFile("themes",tempStr) ); if(!graphics.tileImg) { printf("Couldn't load tile file:'%s'\n", packGetFile("themes",tempStr) ); cleanUpDraw(); return(0); } //Cut tiles into sprites for(i=0; i < NUMTILES; i++) { graphics.tiles[i] = cutSprite(graphics.tileImg, i*20, 0, 20,20); } //Single wall (Override tile15 in graphics.tiles) sprintf(tempStr, "%s.png", li->wallBase); graphics.wallImg = loadImg( packGetFile("themes",tempStr) ); if(!graphics.wallImg) { printf("Couldn't load wall file:'%s'\n", packGetFile("themes",tempStr) ); cleanUpDraw(); return(0); } //Override wall tile free(graphics.tiles[15]); graphics.tiles[15] = cutSprite(graphics.wallImg,0,0,20,20); //Extra walls, if they exist, if they don't, default to tile 6 (from 0) in tiles. sprintf(tempStr, "%s-extra.png", li->wallBase); graphics.wallsImg = loadImg( packGetFile("themes",tempStr) ); if(!graphics.wallsImg) printf("Optional GFX missing: '%s'\n", packGetFile("themes",tempStr) ); int r,c; //rows, column, sprite index i=0; for(r=0; r < 5; r++) { for(c=0; c < 3; c++) { if(graphics.wallsImg) { //Cut out from sheet x=c*20; y=r*20; graphics.walls[i] = cutSprite(graphics.wallsImg, x,y, 20, 20); } else { //Default to the freestanding wall graphics.walls[i] = cutSprite(graphics.wallImg, 0, 0, 20, 20); } i++; } } //Above loop leaves when i==15. //Middle-free is 15 = default tile index in image is 15 (starting from 0). graphics.walls[15] = cutSprite(graphics.wallImg, 0, 0, 20, 20); //Explosions, reuse R as frame number index for(i=0; i < BRICKSEND; i++) { //Open explosion sprintf(tempStr, "%s%02i.png", li->explBase, i); graphics.explImg[i] = loadImg( packGetFile("themes",tempStr) ); if(!graphics.explImg[i] && i==0) printf("Couldn't open '%s'\n",packGetFile("themes",tempStr) ); if(graphics.explImg[i]) graphics.brickExpl[i] = mkAni(graphics.explImg[i], 30,30, 0); else graphics.brickExpl[i] = mkAni(graphics.explImg[0], 30,30, 0); } //Per-Tile animations for(i=0; i < NUMTILES; i++) { sprintf(tempStr, "%s-tile%02i.png", li->tileBase, i); graphics.aniImg[i] = loadImg( packGetFile("themes",tempStr) ); graphics.tileAni[i] = mkAni(graphics.aniImg[i], 30,30, 80); } //Cursor graphics.curImg = loadImg( packGetFile( "themes/cursors",li->cursorFile) ); if( !graphics.curImg ) { printf("Warning: Couldn't find cursor '%s'\n", packGetFile( "themes/cursors",li->cursorFile)); } graphics.curSpr[0] = cutSprite(graphics.curImg, 0, 0, 28,28); graphics.curSpr[1] = cutSprite(graphics.curImg, 28, 0, 28,28); //Load countdown graphics.countDownImg = loadImg( packGetFile(".","countdown.png") ); if(!graphics.countDownImg) { printf("Error(5): couldn't load '%s'\n",packGetFile(".","countdown.png")); return(0); } //Cut countdown for(i=0; i < 4; i++) { graphics.countDownSpr[i] = cutSprite(graphics.countDownImg, 0,i*60, 140,60); } //Teleport path animation color gradient graphics.teleColorIndex=0; float f=255/TELEPATHNUMCOL; for(i=0; i < TELEPATHNUMCOL; i++) { graphics.teleColorTable[i] = SDL_MapRGB( screen->format, 0,(int)(255.0-(float)i*f),0 ); } return(1); }