/** * lädt eine ACT-File in ein ArchivInfo. * * @param[in] file Dateiname der ACT-File * @param[out] items ArchivInfo-Struktur, welche gefüllt wird * * @return Null bei Erfolg, ein Wert ungleich Null bei Fehler * * @author FloSoft * @author OLiver */ int libsiedler2::loader::LoadACT(const std::string& file, ArchivInfo& items) { long size; if(file.empty()) return 1; // Datei zum lesen öffnen boost::scoped_ptr<FILE> act(fopen(file.c_str(), "rb")); // hat das geklappt? if(!act) return 2; fseek(act.get(), 0, SEEK_END); size = ftell(act.get()); fseek(act.get(), 0, SEEK_SET); // sind es 256*3 Bytes, also somit 8bit-RGB? if(size != 256*3) return 3; ArchivItem_Palette* palette = (ArchivItem_Palette*)getAllocator().create(BOBTYPE_PALETTE); if(palette->load(act.get(), false) != 0){ delete palette; return 4; } // einlesen items.clear(); items.push(palette); // Alles OK return 0; }
/** * lädt eine spezifizierten Bobtype aus einer Datei in ein ArchivItem. * * @param[in] bobtype Typ des Items * @param[in] file Filehandle auf die auszulesende Datei * @param[in] palette Grundpalette * @param[out] item ArchivItem-Struktur, welche gefüllt wird * * @return Null bei Erfolg, ein Wert ungleich Null bei Fehler */ int libsiedler2::loader::LoadType(BOBTYPES bobtype, std::istream& file, const ArchivItem_Palette* palette, ArchivItem*& item) { if(!file) return 1; try{ switch(bobtype) { case BOBTYPE_SOUND: // WAVs, MIDIs { libendian::LittleEndianIStreamRef fs(file); unsigned int length; fs >> length; baseArchivItem_Sound* nitem = baseArchivItem_Sound::findSubType(file); if(!nitem || nitem->load(file, length) != 0){ delete nitem; return 5; } item = nitem; } break; case BOBTYPE_BITMAP_RLE: // RLE komprimiertes Bitmap { baseArchivItem_Bitmap_RLE* nitem = dynamic_cast<baseArchivItem_Bitmap_RLE*>(getAllocator().create(BOBTYPE_BITMAP_RLE)); if(nitem->load(file, palette) != 0){ delete nitem; return 6; } item = nitem; } break; case BOBTYPE_FONT: // Font { ArchivItem_Font* nitem = dynamic_cast<ArchivItem_Font*>(getAllocator().create(BOBTYPE_FONT)); if(nitem->load(file, palette) != 0){ delete nitem; return 7; } item = nitem; } break; case BOBTYPE_BITMAP_PLAYER: // Bitmap mit spezifischer Spielerfarbe { ArchivItem_Bitmap_Player* nitem = dynamic_cast<ArchivItem_Bitmap_Player*>(getAllocator().create(BOBTYPE_BITMAP_PLAYER)); if(nitem->load(file, palette) != 0){ delete nitem; return 8; } item = nitem; } break; case BOBTYPE_PALETTE: // Palette { ArchivItem_Palette* nitem = dynamic_cast<ArchivItem_Palette*>(getAllocator().create(BOBTYPE_PALETTE)); if(nitem->load(file) != 0){ delete nitem; return 9; } item = nitem; } break; case BOBTYPE_BOB: // Bobfile { ArchivItem_Bob* nitem = dynamic_cast<ArchivItem_Bob*>(getAllocator().create(BOBTYPE_BOB)); if(nitem->load(file, palette) != 0){ delete nitem; return 10; } item = nitem; } break; case BOBTYPE_BITMAP_SHADOW: // Schatten { baseArchivItem_Bitmap_Shadow* nitem = dynamic_cast<baseArchivItem_Bitmap_Shadow*>(getAllocator().create(BOBTYPE_BITMAP_SHADOW)); if(nitem->load(file, palette) != 0){ delete nitem; return 11; } item = nitem; } break; case BOBTYPE_MAP: // Mapfile { ArchivItem_Map* nitem = dynamic_cast<ArchivItem_Map*>(getAllocator().create(BOBTYPE_MAP)); if(nitem->load(file, false) != 0){ delete nitem; return 12; } item = nitem; } break; case BOBTYPE_TEXT: // Textfile { ArchivItem_Text* nitem = dynamic_cast<ArchivItem_Text*>(getAllocator().create(BOBTYPE_TEXT)); if(nitem->load(file) != 0){ delete nitem; return 13; } item = nitem; } break; case BOBTYPE_BITMAP_RAW: // unkomprimiertes Bitmap { baseArchivItem_Bitmap_Raw* nitem = dynamic_cast<baseArchivItem_Bitmap_Raw*>(getAllocator().create(BOBTYPE_BITMAP_RAW)); if(nitem->load(file, palette) != 0){ delete nitem; return 14; } item = nitem; } break; case BOBTYPE_NONE: item = NULL; break; default: item = NULL; return 42; } if(item != NULL) item->setBobType(bobtype); }catch(std::runtime_error&){ // Mostly error on reading (e.g. unexpected end of file) return 999; } return 0; }