/** Constructor, loads file and prepares to play a vqa movie. * @param the graphicsengine. * @param the soundengine. * @param the name of the vqamovie. */ VQAMovie::VQAMovie(const char *filename) { INIFile *inif; char *fname = new char[strlen(filename)+5]; if( toupper(filename[0]) == 'X' ) vqafile = NULL; else { strcpy( fname, filename ); strcat( fname, ".VQA" ); vqafile = VFS_Open(fname); } delete[] fname; if (vqafile == NULL) { throw VQAError(); } // Get header information for the vqa. If the header is corrupt, we can die now. vqafile->seekSet(0); if (DecodeFORMChunk() == 1) { logger->error("VQA: Invalid FORM chunk\n"); throw VQAError(); } offsets = new Uint32[header.NumFrames]; if (DecodeFINFChunk() == 1) { delete[] offsets; logger->error("VQA: Invalid FINF chunk\n"); throw VQAError(); } CBF_LookUp = new Uint8[0x0ff00 << 3]; CBP_LookUp = new Uint8[0x0ff00 << 3]; VPT_Table = new Uint8[lowoffset<<1]; CBPOffset = 0; /* Starting offset of CBP Look up table must be zero */ CBPChunks = 0; /* Number of CBPChunks */ // FIXME: Use global config data inif = new INIFile("freecnc.ini"); scaleVideo = inif->readInt("video", "fullscreenMovies", 0); videoScaleQuality = inif->readInt("video", "movieQuality", 0); delete inif; }
Weapon::Weapon(const char* wname) { char *pname= 0; char *whname= 0; //char *faname= 0; //char *faimage= 0; map<string, Projectile*>::iterator projentry; map<string, Warhead*>::iterator wheadentry; INIFile * weapini; //SHPImage * fireanimtemp; //Uint8 additional; //Uint8 i; string projname, warheadname; string weapname; INIFile* rules = 0; name = string(wname); rules = new INIFile("rules.ini"); weapini = p::weappool->getWeaponsINI(); weapname = (string)wname; // UPPER the string 'weapname' for_each(weapname.begin(), weapname.end(), toupper); pname = weapini->readString(wname, "projectile"); if (pname == NULL) { logger->warning( "Unable to find projectile for weapon \"%s\" in inifile..\n", wname); throw 0; } projname = (string)pname; // UPPER the string 'projname' for_each(projname.begin(), projname.end(), toupper); projentry = p::weappool->projectilepool.find(projname); if (projentry == p::weappool->projectilepool.end() ) { try { projectile = new Projectile(string(pname), p::raLoader->lnkProjectileDataList, pc::imagepool); } catch(...) { logger->warning("Unable to find projectile \"%s\" used for weapon \"%s\".\nUnit using this weapon will be unarmed\n", pname, wname); delete[] pname; throw 0; } p::weappool->projectilepool[projname] = projectile; } else { projectile = projentry->second; } delete[] pname; whname = weapini->readString(wname, "warhead"); if (whname==NULL) { logger->warning( "Unable to find warhead for weapon \"%s\" in inifile..\n", wname); throw 0; } warheadname = (string)whname; transform(warheadname.begin(), warheadname.end(), warheadname.begin(), toupper); wheadentry = p::weappool->warheadpool.find(warheadname); if (wheadentry == p::weappool->warheadpool.end() ) { try { // Try to create the Warhead whead = new Warhead(whname, p::raLoader->lnkWarheadDataList); } catch(...) { logger->warning("Unable to find Warhead \"%s\" used for weapon \"%s\".\nUnit using this weapon will be unarmed\n", whname, wname); delete[] whname; throw 0; } p::weappool->warheadpool[warheadname] = whead; } else { whead = wheadentry->second; } delete[] whname; speed = weapini->readInt(wname, "speed", 100); range = weapini->readInt(wname, "range", 4); reloadtime = weapini->readInt(wname, "reloadtime", 50); damage = weapini->readInt(wname, "damage", 10); burst = weapini->readInt(wname, "burst", 1); heatseek = (weapini->readInt(wname, "heatseek", 0) != 0); // pc::imagepool->push_back(new SHPImage("minigun.shp", mapscaleq)); //firesound = weapini->readString(wname, "firesound"); //printf("wname = %s\n", wname); report = rules->readString(wname, "Report"); if (report != 0){ string soundWeap = report; soundWeap += string(".aud"); transform(soundWeap.begin(), soundWeap.begin(), soundWeap.end(), tolower); //logger->debug("Report = %s\n", soundWeap.c_str()); report = cppstrdup(soundWeap.c_str()); pc::sfxeng->LoadSound(report); } reloadsound = weapini->readString(wname, "reloadsound"); if (reloadsound != 0) pc::sfxeng->LoadSound(reloadsound); chargingsound = weapini->readString(wname, "chargingsound"); if (chargingsound != 0) pc::sfxeng->LoadSound(chargingsound); fuel = weapini->readInt(wname, "fuel", 0); seekfuel = weapini->readInt(wname, "seekfuel", 0); // @todo Implemente Anim in [Weapon] /* fireimage = pc::imagepool->size()<<16; faname = weapini->readString(wname, "fireimage", "none"); //printf ("%s line %i: Weapon = %s, fireimage = %s\n", __FILE__, __LINE__, wname, faname); if (strcmp((faname), ("none")) == 0) { delete[] faname; numfireimages = 0; numfiredirections = 1; fireimage = 0; } else { additional = (Uint8)weapini->readInt(faname, "additional", 0); faimage = weapini->readString(faname, "image", "minigun.shp"); try { fireanimtemp = new SHPImage(faimage, -1); } catch (ImageNotFound&) { throw 0; } delete[] faimage; faimage = NULL; numfireimages = fireanimtemp->getNumImg(); numfiredirections = weapini->readInt(faname, "directions", 1); if (numfiredirections == 0) { numfiredirections = 1; } fireimages = new Uint32[numfiredirections]; fireimages[0] = fireimage; pc::imagepool->push_back(fireanimtemp); if (additional != 0) { char* tmpname = new char[12]; for (i=2; i<=additional; ++i) { sprintf(tmpname, "image%i", i); faimage = weapini->readString(faname, tmpname, ""); if (strcmp((faimage), ("")) != 0) { try { fireanimtemp = new SHPImage(faimage, -1); } catch (ImageNotFound&) { throw 0; } fireimages[i-1]=(pc::imagepool->size()<<16); numfireimages += fireanimtemp->getNumImg(); pc::imagepool->push_back(fireanimtemp); } else { fireimages[i] = 0; logger->warning("%s was empty in [%s]\n", tmpname, faname); } delete[] faimage; faimage = NULL; } delete[] tmpname; } else if (numfiredirections != 1) { for (i=1; i<numfiredirections; ++i) { fireimages[i] = fireimage+i*(numfireimages/numfiredirections); } } delete[] faname; }*/ // Free rules.ini delete rules; }
Weapon::Weapon(const char* wname) : name(wname) { char *pname, *whname, *faname, *faimage; map<string, Projectile*>::iterator projentry; map<string, Warhead*>::iterator wheadentry; INIFile *weapini = p::weappool->getWeaponsINI(); SHPImage* fireanimtemp; Uint8 additional, i; string projname, warheadname; string weapname = (string)wname; string::iterator p = weapname.begin(); while (p!=weapname.end()) *p++ = toupper(*p); pname = weapini->readString(wname, "projectile"); if( pname == NULL ) { logger->warning("Unable to find projectile for weapon \"%s\" in inifile..\n", wname); throw 0; } projname = (string)pname; p = projname.begin(); while (p!=projname.end()) *p++ = toupper(*p); projentry = p::weappool->projectilepool.find(projname); if( projentry == p::weappool->projectilepool.end() ) { try { projectile = new Projectile(pname, weapini); } catch(int) { logger->warning("Unable to find projectile \"%s\" used for weapon \"%s\".\nUnit using this weapon will be unarmed\n", pname, wname); delete[] pname; throw 0; } p::weappool->projectilepool[projname] = projectile; } else { projectile = projentry->second; } delete[] pname; whname = weapini->readString(wname, "warhead"); if( whname == NULL ) { logger->warning("Unable to find warhead for weapon \"%s\" in inifile..\n", wname); throw 0; } warheadname = (string)whname; transform(warheadname.begin(),warheadname.end(), warheadname.begin(), toupper); wheadentry = p::weappool->warheadpool.find(warheadname); if( wheadentry == p::weappool->warheadpool.end() ) { try { whead = new Warhead(whname, weapini); } catch (int) { logger->warning("Unable to find Warhead \"%s\" used for weapon \"%s\".\nUnit using this weapon will be unarmed\n", whname, wname); delete[] whname; throw 0; } p::weappool->warheadpool[warheadname] = whead; } else { whead = wheadentry->second; } delete[] whname; speed = weapini->readInt(wname, "speed", 100); range = weapini->readInt(wname, "range", 1); reloadtime = weapini->readInt(wname, "reloadtime", 5); damage = weapini->readInt(wname, "damage", 10); burst = weapini->readInt(wname, "burst", 1); heatseek = (weapini->readInt(wname, "heatseek", 0) != 0); fireimage = pc::imagepool->size()<<16; // pc::imagepool->push_back(new SHPImage("minigun.shp", mapscaleq)); firesound = weapini->readString(wname, "firesound"); chargesound = weapini->readString(wname, "chargesound"); fuel = weapini->readInt(wname, "fuel", 0); seekfuel = weapini->readInt(wname, "seekfuel", 0); faname = weapini->readString(wname, "fireimage", "none"); if (strcasecmp(faname,"none") == 0) { delete[] faname; numfireimages = 0; numfiredirections = 1; fireimage = 0; } else { additional = (Uint8)weapini->readInt(faname,"additional",0); faimage = weapini->readString(faname, "image", "minigun.shp"); try { fireanimtemp = new SHPImage(faimage, mapscaleq); } catch (ImageNotFound&) { throw 0; } delete[] faimage; faimage = NULL; numfireimages = fireanimtemp->getNumImg(); numfiredirections = weapini->readInt(faname, "directions", 1); if (numfiredirections == 0) { numfiredirections = 1; } fireimages = new Uint32[numfiredirections]; fireimages[0] = fireimage; pc::imagepool->push_back(fireanimtemp); if (additional != 0) { char* tmpname = new char[12]; for (i=2;i<=additional;++i) { sprintf(tmpname,"image%i",i); faimage = weapini->readString(faname, tmpname, ""); if (strcasecmp(faimage,"") != 0) { try { fireanimtemp = new SHPImage(faimage, mapscaleq); } catch (ImageNotFound&) { throw 0; } fireimages[i-1]=(pc::imagepool->size()<<16); numfireimages += fireanimtemp->getNumImg(); pc::imagepool->push_back(fireanimtemp); } else { fireimages[i] = 0; logger->warning("%s was empty in [%s]\n",tmpname,faname); } delete[] faimage; faimage = NULL; } delete[] tmpname; } else if (numfiredirections != 1) { for (i=1;i<numfiredirections;++i) { fireimages[i] = fireimage+i*(numfireimages/numfiredirections); } } delete[] faname; } }