void CEGASprit::DerivePlayerSprites( const int id, std::vector<GsSprite> &sprites ) { for(Uint16 s=0 ; s<gGraphics.getSpriteVec(id).size() ; s++) { GsSprite &Sprite = gGraphics.getSprite(id,s); Sprite.optimizeSurface(); } // Try to load player sprites here! std::set<std::string> filelist; FileListAdder fileListAdder; std::string gfxpath = JoinPaths(m_gamepath, "gfx"); GetFileList(filelist, fileListAdder, gfxpath, false, FM_REG); const std::string spriteFn = "sprite"+itoa(id)+"_"; FilterFilelist(filelist, spriteFn); std::set<std::string>::iterator it = filelist.begin(); for( ; it != filelist.end() ; it++ ) { std::string name = *it; const int num = getRessourceID(name, spriteFn); GsSprite &Sprite = gGraphics.getSprite(id,num); std::string filename = getResourceFilename("gfx/"+name, m_gamepath, false, true); Sprite.loadHQSprite(filename); Sprite.applyTransparency(); } }
bool CEGASprit::loadData(const std::string& filename, bool compresseddata) { byte *RawData; SDL_Surface *sfc; Uint8* pixel; Uint32 percent = 0; FILE* latchfile = OpenGameFile(filename.c_str(),"rb"); if(!latchfile) return false; gResourceLoader.setPermilage(10); RawData = new byte[m_planesize * 5]; // get the data out of the file into the memory, decompressing it if necessary. if (compresseddata) { if (lz_decompress(latchfile, RawData)) return 1; } else { for(int i=0 ; i<(m_planesize*5) ; i++) RawData[i] = fgetc(latchfile); } fclose(latchfile); gResourceLoader.setPermilage(50); // TODO: Try to blit the Font map here! // these are the offsets of the different video planes as // relative to each other--that is if a pixel in plane1 // is at N, the byte for that same pixel in plane3 will be // at (N + plane3). unsigned long plane1, plane2, plane3, plane4, plane5; plane1 = 0; plane2 = (m_planesize * 1); plane3 = (m_planesize * 2); plane4 = (m_planesize * 3); plane5 = (m_planesize * 4); CPlanes Planes(RawData + m_spriteloc); Planes.setOffsets(plane1, plane2, plane3, plane4, plane5); // load the image data gGraphics.createEmptySprites(4,MAX_SPRITES+1); for(int i=0 ; i<m_numsprites ; i++) { GsSprite &Sprite = gGraphics.getSprite(0,i); Sprite.setSize( EGASpriteModell[i].width, EGASpriteModell[i].height ); Sprite.setBoundingBoxCoordinates( (EGASpriteModell[i].hitbox_l << STC), (EGASpriteModell[i].hitbox_u << STC), (EGASpriteModell[i].hitbox_r << STC), (EGASpriteModell[i].hitbox_b << STC) ); Sprite.createSurface( gVideoDriver.mpVideoEngine->getBlitSurface()->flags, gGraphics.Palette.m_Palette ); percent = (i*50)/m_numsprites; gResourceLoader.setPermilage(50+percent); } gResourceLoader.setPermilage(100); for(int p=0 ; p<4 ; p++) { for(int s=0 ; s<m_numsprites ; s++) { sfc = gGraphics.getSprite(0,s).getSDLSurface(); if(SDL_MUSTLOCK(sfc)) SDL_LockSurface(sfc); pixel = (Uint8*) sfc->pixels; Planes.readPlane(p, pixel, sfc->w, sfc->h); if(SDL_MUSTLOCK(sfc)) SDL_UnlockSurface(sfc); percent = (s*100)/m_numsprites; gResourceLoader.setPermilage(100+percent); } } gResourceLoader.setPermilage(200); // now load the 5th plane, which contains the sprite masks. // note that we invert the mask because our graphics functions // use white on black masks whereas keen uses black on white. for(int s=0 ; s<m_numsprites ; s++) { GsSprite &Sprite = gGraphics.getSprite(0,s); SDL_Surface *pixsfc = Sprite.getSDLSurface(); SDL_Surface *masksfc = Sprite.getSDLMaskSurface(); if(SDL_MUSTLOCK(pixsfc)) SDL_LockSurface(pixsfc); if(SDL_MUSTLOCK(masksfc)) SDL_LockSurface(masksfc); pixel = (Uint8*) masksfc->pixels; for(int y=0 ; y<masksfc->h ; y++) { for(int x=0 ; x<masksfc->w ; x++) { if(Planes.getbit(4)) pixel[y*masksfc->w + x] = ((Uint8*)pixsfc->pixels)[y*pixsfc->w + x]; else pixel[y*masksfc->w + x] = 15; } } if(SDL_MUSTLOCK(masksfc)) SDL_UnlockSurface(masksfc); if(SDL_MUSTLOCK(pixsfc)) SDL_UnlockSurface(pixsfc); percent = (s*100)/m_numsprites; gResourceLoader.setPermilage(200+percent); } gResourceLoader.setPermilage(300); if(RawData){ delete[] RawData; RawData = NULL;} LoadSpecialSprites( gGraphics.getSpriteVec(0) ); for(unsigned int i=1 ; i<4 ; i++) { gGraphics.getSpriteVec(i) = gGraphics.getSpriteVec(0); } // For the other variant let's exchange some colors auto &SpriteVecPlayer2 = gGraphics.getSpriteVec(1); for( unsigned int i = 0 ; i < SpriteVecPlayer2.size() ; i++) { auto &sprite = SpriteVecPlayer2[i]; // Red against Purple sprite.exchangeSpriteColor( 5, 4, 0 ); sprite.exchangeSpriteColor( 13, 12, 0 ); // Yellow against Green sprite.exchangeSpriteColor( 2, 6, 0 ); sprite.exchangeSpriteColor( 10, 14, 0 ); } auto &SpriteVecPlayer3 = gGraphics.getSpriteVec(2); for( auto &sprite : SpriteVecPlayer3) { // Red against Green sprite.exchangeSpriteColor( 2, 4, 0 ); sprite.exchangeSpriteColor( 10, 12, 0 ); // Yellow against Purple sprite.exchangeSpriteColor( 5, 6, 0 ); sprite.exchangeSpriteColor( 13, 14, 0 ); } auto &SpriteVecPlayer4 = gGraphics.getSpriteVec(3); for( auto &sprite : SpriteVecPlayer4) { // Red against Yellow sprite.exchangeSpriteColor( 6, 4, 0 ); sprite.exchangeSpriteColor( 14, 12, 0 ); // Green against Purple sprite.exchangeSpriteColor( 2, 5, 0 ); sprite.exchangeSpriteColor( 10, 13, 0 ); } for(unsigned int i=0 ; i<4 ; i++) { for(Uint16 s=0 ; s<gGraphics.getSpriteVec(i).size() ; s++) { GsSprite &Sprite = gGraphics.getSprite(i,s); Sprite.optimizeSurface(); percent = (s*50)/m_numsprites; gResourceLoader.setPermilage(300+percent); } } gResourceLoader.setPermilage(350); std::set<std::string> filelist; FileListAdder fileListAdder; std::string gfxpath = JoinPaths(m_gamepath, "gfx"); GetFileList(filelist, fileListAdder, gfxpath, false, FM_REG); FilterFilelist(filelist, "sprite"); std::set<std::string>::iterator it = filelist.begin(); int listsize = filelist.size(); for( int c=0 ; it != filelist.end() ; it++, c++ ) { std::string name=*it; if(name.find("_") != name.npos) continue; int num = getRessourceID(name, "sprite"); if(num < m_numsprites ) { GsSprite &Sprite = gGraphics.getSprite(0, num); std::string filename = getResourceFilename("gfx/"+name, m_gamepath, false, true); Sprite.loadHQSprite(filename); } percent = (c*150)/listsize; gResourceLoader.setPermilage(350+percent); } gResourceLoader.setPermilage(500); for(unsigned int i=0 ; i<4 ; i++) { const int NoSprites = gGraphics.getSpriteVec(i).size(); for(Uint16 s=0 ; s<NoSprites ; s++) { gGraphics.getSprite(i,s).applyTransparency(); percent = (s*250)/NoSprites; gResourceLoader.setPermilage(500+percent); } } gResourceLoader.setPermilage(750); // Now create special sprites, like those for effects and the doors! DeriveSpecialSprites( gGraphics.getTileMap(1), gGraphics.getSpriteVec(0) ); gResourceLoader.setPermilage(800); // Here special Effects are applied, only when the option is enabled for it if(gVideoDriver.getSpecialFXConfig()) ApplySpecialFX(); gResourceLoader.setPermilage(900); // Apply the sprites for player 2,3 and 4 DerivePlayerSprites( 1,gGraphics.getSpriteVec(1) ); DerivePlayerSprites( 2,gGraphics.getSpriteVec(2) ); DerivePlayerSprites( 3,gGraphics.getSpriteVec(3) ); gResourceLoader.setPermilage(1000); return true; }
void CEGASprit::DerivePlayerSprites( std::vector<CSprite> &sprites ) { // create the sprites for player 2, 3 and 4 for(size_t i=0;i<48;i++) { size_t s = SECOND_PLAYER_BASEFRAME+i; sprites.at(i).copy( sprites.at(s), g_pGfxEngine->Palette.m_Palette ); sprites.at(s).replaceSpriteColor( 13, 11 ,0 ); sprites.at(s).replaceSpriteColor( 5, 3 ,0 ); sprites.at(s).replaceSpriteColor( 12, 9 ,0 ); sprites.at(s).replaceSpriteColor( 4, 1 ,0 ); sprites.at(s).optimizeSurface(); } for(size_t i=0;i<48;i++) { size_t s = THIRD_PLAYER_BASEFRAME+i; sprites.at(i).copy( sprites.at(s), g_pGfxEngine->Palette.m_Palette ); sprites.at(s).replaceSpriteColor( 13, 10, 0 ); // Shirt light sprites.at(s).replaceSpriteColor( 5, 2, 0 ); // Shirt dark sprites.at(s).replaceSpriteColor( 12, 2, 16 ); // Shoes light sprites.at(s).replaceSpriteColor( 4, 0, 16 ); // Shoes dark sprites.at(s).optimizeSurface(); } for(size_t i=0;i<48;i++) { size_t s = FOURTH_PLAYER_BASEFRAME+i; sprites.at(i).copy( sprites.at(s), g_pGfxEngine->Palette.m_Palette ); sprites.at(s).replaceSpriteColor( 13, 14, 0 ); // Shirt light sprites.at(s).replaceSpriteColor( 5, 6, 0 ); // Shirt dark sprites.at(s).replaceSpriteColor( 12, 6, 16 ); // Shoes light sprites.at(s).replaceSpriteColor( 4, 0, 16 ); // Shoes dark sprites.at(s).optimizeSurface(); } for(Uint16 s=0 ; s<g_pGfxEngine->getSpriteVec().size() ; s++) { CSprite &Sprite = g_pGfxEngine->getSprite(s); Sprite.optimizeSurface(); } // Try to load player sprites here! std::set<std::string> filelist; FileListAdder fileListAdder; std::string gfxpath = JoinPaths(m_gamepath, "gfx"); GetFileList(filelist, fileListAdder, gfxpath, false, FM_REG); FilterFilelist(filelist, "sprite"); std::set<std::string>::iterator it = filelist.begin(); for( ; it != filelist.end() ; it++ ) { std::string name=*it; int num = getRessourceID(name, "sprite"); if( num>=SECOND_PLAYER_BASEFRAME && num<FOURTH_PLAYER_BASEFRAME+48 ) { CSprite &Sprite = g_pGfxEngine->getSprite(num); std::string filename = getResourceFilename("gfx/"+name, m_gamepath, false, true); Sprite.loadHQSprite(filename); Sprite.applyTransparency(); } } }
bool CEGALatch::loadData( std::string &path, short episode, int version, unsigned char *data, bool compresseddata ) { std::string filename; byte *RawData; Uint16 width, height; SDL_Surface *sfc; filename = getResourceFilename("egalatch.ck" + itoa(episode), path); FILE* latchfile = OpenGameFile(filename,"rb"); if(!latchfile) return false; RawData = new byte[m_latchplanesize * 4]; // get the data out of the file into the memory, decompressing it if necessary. if (compresseddata) { if (lz_decompress(latchfile, (unsigned char*) RawData)) { return 1; } } else { for(int i=0 ; i<(m_latchplanesize*4) ; i++) RawData[i] = fgetc(latchfile); } fclose(latchfile); // these are the offsets of the different video planes as // relative to each other--that is if a pixel in plane1 // is at N, the byte for that same pixel in plane3 will be // at (N + plane3). unsigned long plane1, plane2, plane3, plane4; plane1 = 0; plane2 = (m_latchplanesize * 1); plane3 = (m_latchplanesize * 2); plane4 = (m_latchplanesize * 3); // ** read the 8x8 tiles ** // set up the getbit() function of CPlanes class CPlanes Planes(RawData); Planes.setOffsets(plane1 + m_fontlocation, plane2 + m_fontlocation, plane3 + m_fontlocation, plane4 + m_fontlocation, 0); // Load these graphics into the CFont Class of CGfxEngine // The original vorticon engine only uses one fontmap, but we use another for // extra icons. For example sliders are in that map g_pGfxEngine->freeFonts(); g_pGfxEngine->createEmptyFontmaps(3); g_pGfxEngine->getFont(0).loadinternalFont(); CFont &Font = g_pGfxEngine->getFont(1); Font.CreateSurface( g_pGfxEngine->Palette.m_Palette, SDL_SWSURFACE ); sfc = Font.getSDLSurface(); g_pGfxEngine->getFont(2).loadAlternateFont(); if(SDL_MUSTLOCK(sfc)) SDL_LockSurface(sfc); Uint8 *pixel = (Uint8*) sfc->pixels; SDL_FillRect(sfc, NULL, 0); for(int p=0;p<4;p++) Planes.readPlaneofTiles(p, pixel, 16, 8, m_fonttiles); if(SDL_MUSTLOCK(sfc)) SDL_UnlockSurface(sfc); // ** read the 16x16 tiles ** Planes.setOffsets(plane1 + m_tiles16location, plane2 + m_tiles16location, plane3 + m_tiles16location, plane4 + m_tiles16location, 0); g_pGfxEngine->freeTilemap(); g_pGfxEngine->createEmptyTilemap(2); CTilemap &Tilemap = g_pGfxEngine->getTileMap(1); Tilemap.CreateSurface( g_pGfxEngine->Palette.m_Palette, SDL_SWSURFACE, m_num16tiles, 4, 13 ); sfc = Tilemap.getSDLSurface(); SDL_FillRect(sfc,NULL, 0); if(SDL_MUSTLOCK(sfc)) SDL_LockSurface(sfc); Uint8 *u_pixel = (Uint8*) sfc->pixels; for(int p=0;p<4;p++) Planes.readPlaneofTiles(p, u_pixel, 13, 16, m_num16tiles); if(SDL_MUSTLOCK(sfc)) SDL_UnlockSurface(sfc); // Load Hi-Colour, VGA, SVGA Tiles into the tilemap filename = getResourceFilename("gfx/ck" + itoa(episode) + "tiles.bmp", path, false); if(Tilemap.loadHiresTile(filename)) g_pLogFile->textOut(GREEN, "VGA Bitmap for Tileset has been loaded successfully!"); // Adapt the tilemap to the display, so they are faster blit Tilemap.optimizeSurface(); // make masked tiles according to it's surfaces applyMasks(); //////////////////// /// Load Bitmaps /// //////////////////// Planes.setOffsets(plane1 + m_bitmaplocation, plane2 + m_bitmaplocation, plane3 + m_bitmaplocation, plane4 + m_bitmaplocation, 0); // decode bitmaps into the BitmapData structure. The bitmaps are // loaded into one continuous stream of image data, with the bitmaps[] // array giving pointers to where each bitmap starts within the stream. for(int p=0 ; p<4 ; p++) { for(int b=0 ; b<m_bitmaps ; b++) { CBitmap &bitmap = g_pGfxEngine->getBitmap(b); // this points to the location that we're currently // decoding bitmap data to sfc= bitmap.getSDLSurface(); if(SDL_MUSTLOCK(sfc)) SDL_LockSurface(sfc); Uint8* pixel = (Uint8*) sfc->pixels; if(p==0) SDL_FillRect(sfc, NULL, 0); width = bitmap.getWidth(); height = bitmap.getHeight(); // Now read the raw data Planes.readPlane(p, pixel, width, height); if(SDL_MUSTLOCK(sfc)) SDL_UnlockSurface(sfc); } } // optimize the bitmaps and load hq bitmaps if there are some. for(int b=0 ; b<m_bitmaps ; b++) { CBitmap &bitmap = g_pGfxEngine->getBitmap(b); bitmap.optimizeSurface(); } std::set<std::string> filelist; FileListAdder fileListAdder; std::string gfxpath = JoinPaths(path, "gfx"); GetFileList(filelist, fileListAdder, gfxpath, false, FM_REG); FilterFilelist(filelist, "bitmap"); std::set<std::string>::iterator it = filelist.begin(); for( ; it != filelist.end() ; it++ ) { std::string filename=*it; int num = getRessourceID(filename, "bitmap"); CBitmap &bitmap = g_pGfxEngine->getBitmap(num); filename = getResourceFilename("gfx/" + filename, path, false); bitmap.loadHQBitmap(filename); } if(RawData){ delete[] RawData; RawData = NULL;} return true; }
bool CEGALatch::loadData( const std::string &path, const short episode, const int version, const unsigned char *data, const bool compresseddata ) { std::string filename; byte *RawData; Uint16 width, height; SDL_Surface *sfc; filename = getResourceFilename("egalatch.ck" + itoa(episode), path); FILE* latchfile = OpenGameFile(filename,"rb"); if(!latchfile) return false; RawData = new byte[m_latchplanesize * 4]; // get the data out of the file into the memory, decompressing it if necessary. if (compresseddata) { if (lz_decompress(latchfile, (unsigned char*) RawData)) { return 1; } } else { for(int i=0 ; i<(m_latchplanesize*4) ; i++) RawData[i] = fgetc(latchfile); } fclose(latchfile); // these are the offsets of the different video planes as // relative to each other--that is if a pixel in plane1 // is at N, the byte for that same pixel in plane3 will be // at (N + plane3). unsigned long plane1, plane2, plane3, plane4; plane1 = 0; plane2 = (m_latchplanesize * 1); plane3 = (m_latchplanesize * 2); plane4 = (m_latchplanesize * 3); // ** read the 8x8 tiles ** // set up the getbit() function of CPlanes class CPlanes Planes(RawData); Planes.setOffsets(plane1 + m_fontlocation, plane2 + m_fontlocation, plane3 + m_fontlocation, plane4 + m_fontlocation, 0); // Load these graphics into the GsFont Class of GsGraphics // The original vorticon engine only uses one fontmap, but we use another for // extra icons. For example sliders are in that map gGraphics.freeFonts(); gGraphics.createEmptyFontmaps(3); gGraphics.getFont(0).loadinternalFont(); GsFont &Font = gGraphics.getFont(1); Font.CreateSurface( gGraphics.Palette.m_Palette, SDL_SWSURFACE ); sfc = Font.getSDLSurface(); gGraphics.getFont(2).loadAlternateFont(); if(SDL_MUSTLOCK(sfc)) SDL_LockSurface(sfc); Uint8 *pixel = (Uint8*) sfc->pixels; SDL_FillRect(sfc, NULL, 0); for(int p=0;p<4;p++) Planes.readPlaneofTiles(p, pixel, 16, 8, m_fonttiles); if(SDL_MUSTLOCK(sfc)) SDL_UnlockSurface(sfc); // prepare to ** read the 16x16 tiles ** Planes.setOffsets(plane1 + m_tiles16location, plane2 + m_tiles16location, plane3 + m_tiles16location, plane4 + m_tiles16location, 0); gGraphics.freeTilemap(); gGraphics.createEmptyTilemaps(2); loadTilemap(gGraphics.getTileMap(0), Planes, episode, path); // prepare to ** read the 16x16 tiles **, this is for the second plane. Planes.setOffsets(plane1 + m_tiles16location, plane2 + m_tiles16location, plane3 + m_tiles16location, plane4 + m_tiles16location, 0); loadTilemap(gGraphics.getTileMap(1), Planes, episode, path); gGraphics.getTileMap(0).optimizeSurface(); gGraphics.getTileMap(1).optimizeSurface(); // make masked tiles according to it's surfaces applyMasks(); //////////////////// /// Load Bitmaps /// //////////////////// Planes.setOffsets(plane1 + m_bitmaplocation, plane2 + m_bitmaplocation, plane3 + m_bitmaplocation, plane4 + m_bitmaplocation, 0); // decode bitmaps into the BitmapData structure. The bitmaps are // loaded into one continuous stream of image data, with the bitmaps[] // array giving pointers to where each bitmap starts within the stream. for(int p=0 ; p<4 ; p++) { for(int b=0 ; b<m_bitmaps ; b++) { GsBitmap &bitmap = gGraphics.getBitmapFromId(b); // this points to the location that we're currently // decoding bitmap data to sfc= bitmap.getSDLSurface(); if(SDL_MUSTLOCK(sfc)) SDL_LockSurface(sfc); Uint8* pixel = (Uint8*) sfc->pixels; if(p==0) SDL_FillRect(sfc, NULL, 0); width = bitmap.getWidth(); height = bitmap.getHeight(); // Now read the raw data Planes.readPlane(p, pixel, width, height); if(SDL_MUSTLOCK(sfc)) SDL_UnlockSurface(sfc); } } std::set<std::string> filelist; FileListAdder fileListAdder; std::string gfxpath = JoinPaths(path, "gfx"); GetFileList(filelist, fileListAdder, gfxpath, false, FM_REG); FilterFilelist(filelist, "bitmap"); std::set<std::string>::iterator it = filelist.begin(); for( ; it != filelist.end() ; it++ ) { std::string filename=*it; int num = getRessourceID(filename, "bitmap"); GsBitmap &bitmap = gGraphics.getBitmapFromId(num); filename = getResourceFilename("gfx/" + filename, path, false); bitmap.loadHQBitmap(filename); } if(RawData){ delete[] RawData; RawData = NULL;} // Create an intro in case it does not exist yet std::string fullpath = getResourceFilename("preview.bmp", path, false); if( fullpath == "" ) { // Not found create it fullpath = path + "/preview.bmp"; fullpath = GetWriteFullFileName(fullpath, true); GsBitmap *pBitmap = gGraphics.getBitmapFromStr("TITLE"); SDL_SaveBMP( pBitmap->getSDLSurface(), fullpath.c_str()); } return true; }