Пример #1
0
/** 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;
}
Пример #2
0
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;
}
Пример #3
0
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;
    }
}