예제 #1
0
파일: g_map.cpp 프로젝트: jder/verge3
/****************************** code ******************************/
Layer::Layer(VFILE *f)
{
	lucent = 0; width = height = 0;
	vread(layername, 256, f);
	vread(&parallax_x, 8, f);
	vread(&parallax_y, 8, f);
	vread(&width, 2, f);
	vread(&height, 2, f);
	vread(&lucent, 1, f);

	tiledata = new word[width*height];
	cvread(tiledata, width*height*2, f);
    x_offset = y_offset = 0; // no offset until parallax has changed
}
예제 #2
0
파일: g_vsp.cpp 프로젝트: speveril/verge3
void VSP::LoadVSP(VFILE *f)
{
	int signature;
	vread(&signature, 4, f);
	if (signature != VSP_SIGNATURE)
		err("VSP::LoadVSP() - Invalid VSP signature!");

	int version;
	vread(&version, 4, f);
	if (version != VSP_VERSION)
		err("VSP::LoadVSP() - Invalid version (%d)", version);

	int tilesize;
	vread(&tilesize, 4, f);
	if (tilesize != 16)
		err("VSP::LoadVSP() - bzzzzzzzzttt. Try a 16x16 vsp! %d",tilesize);

	int format;
	vread(&format, 4, f);
	vread(&numtiles, 4, f);

	int compression;
	vread(&compression, 4, f);
	if (compression != VSP_ZLIB) err("huhhruhoeijfaoijrf..fdpok no compression? tell vecna!!!");
	byte *tiledatabuf = new byte[16*16*3*numtiles];
	cvread(tiledatabuf, 16*16*3*numtiles, f);

	container = new image(16, 16);
	container->delete_data();

	vspdata = ImageFrom24bpp(tiledatabuf, 16, 16*numtiles);
	delete[] tiledatabuf;

	vread(&numanims, 4, f);
	anims = new vspanim_r[numanims];
	for(int i = 0; i < numanims; i++)
	{
		vread(anims[i].name, 256, f);
		vread(&anims[i].start, 4, f);
		vread(&anims[i].finish, 4, f);
		vread(&anims[i].delay, 4, f);
		vread(&anims[i].mode, 4, f);
	}

	ValidateAnimations();

	vread(&numobs, 4, f);
	obs = new char[numobs*256];
	cvread(obs, numobs*256, f);

	// initialize tile anim stuff
	tileidx = new int[numtiles];
	flipped = new int[numtiles];
	vadelay = new int[numanims];

	int i;
	for (i=0; i<numanims; i++)
		vadelay[i]=0;
	for (i=0; i<numtiles; i++)
	{
		flipped[i] = 0;
		tileidx[i] = i;
	}
	mytimer = systemtime;

	// Overkill (2006-07-20): And added back in.
	SetHandleImage(2, vspdata);
}
예제 #3
0
파일: g_map.cpp 프로젝트: jder/verge3
MAP::MAP(char *fname)
{
	VFILE *f = vopen(fname);
	if (!f)
		err("MAP::MAP() - could not load map %s", fname);

	strcpy(mapfname, fname);
	strlwr(mapfname);

	char signature[8];
	vread(signature, 6, f);
	if (strcmp(signature, maptag))
		err("MAP::MAP() - %s is not a valid mapfile!", fname);

	int version;
	vread(&version, 4, f);
	if (version != MAP_VERSION)
		err("MAP::MAP() - %s is not the correct MAP format version!", fname);
	vread(&version, 4, f); // skip vc offset

	vread(mapname, 256, f);
	vread(vspname, 256, f);
	strcpy(savevspname, vspname); // Overkill 2006-05-21
	vread(musicname, 256, f);
	vread(renderstring, 256, f);
	vread(startupscript, 256, f);

	PlayMusic(musicname);

	startx = starty = 0;
	vread(&startx, 2, f);
	vread(&starty, 2, f);

	std::string s = std::string(fname);
	int offs = s.rfind('\\');
	if (offs >= 0)
	{
		s.replace(offs+1,strlen(fname),vspname);
		tileset = new VSP((char *)s.c_str());
	}
	else
	{
		offs = s.rfind('/');
		if (offs >= 0)
		{
			s.replace(offs+1,strlen(fname),vspname);
			tileset = new VSP((char *)s.c_str());
		}
		else
			tileset = new VSP(vspname);
	}

	vread(&numlayers, 4, f);

	//layers = new Layer*[numlayers];
	layers.resize(numlayers);
	int i;
	for (i=0; i<numlayers; i++)
		layers[i] = new Layer(f);

	mapwidth = layers[0]->width;
	mapheight = layers[0]->height;

	obslayer = new byte[mapwidth*mapheight];
	zonelayer = new word[mapwidth*mapheight];
	cvread(obslayer, mapwidth*mapheight, f);
	cvread(zonelayer, mapwidth*mapheight*2, f);

	vread(&numzones, 4, f);
	zones.resize(numzones);
	for (i=0; i<numzones; i++)
	{
		zones[i] = new Zone;
		zones[i]->percent = zones[i]->method = zones[i]->delay = 0;
		vread(zones[i]->name, 256, f);
		vread(zones[i]->script, 256, f);
		vread(&zones[i]->percent, 1, f);
		vread(&zones[i]->delay, 1, f);
		vread(&zones[i]->method, 1, f);
	}

	vread(&mapentities, 4, f);

	for (i=0; i<mapentities; i++)
	{
		int t=0, x1=0, y1=0, x2=0, y2=0;
		char movescript[256], chrname[256], script[256], description[256];

		vread(&x1, 2, f);
		vread(&y1, 2, f);
		int o1 = vtell(f);
		vseek(f, 22, 1);
		vread(movescript, 256, f);
		vread(chrname, 256, f);
		vread(description, 256, f); // this is actually the description which we dont care about
		vread(script, 256, f); // this is the actual script
		vseek(f, o1, 0);

		int i = AllocateEntity(x1*16, y1*16, chrname);

		entity[i]->description = description;
		entity[i]->script = script;
		vread(&t, 1, f);
		if (!t) t = SOUTH;
		entity[i]->setface(t); t=0;
		vread(&t, 1, f);
		entity[i]->obstructable = t ? true : false; t=0;
		vread(&t, 1, f);
		entity[i]->obstruction = t ? true : false; t=0;
		vread(&t, 1, f);
		entity[i]->autoface = (t!=0); t=0;
		vread(&t, 2, f);
		entity[i]->setspeed(t); t=0;
		vread(&t, 1, f);
		// activation mode FIXME
		vread(&t, 1, f);

		vread(&x1, 2, f);
		vread(&y1, 2, f);
		vread(&x2, 2, f);
		vread(&y2, 2, f);
		switch(t)
		{
			case 0: entity[i]->SetMotionless(); break;
			case 1: entity[i]->SetWanderZone(); break;
			case 2: entity[i]->SetWanderBox(x1, y1, x2, y2); break; //FIXME
			case 3: entity[i]->SetMoveScript(movescript); break;
		}
		t=0; vread(&t, 2, f);
		entity[i]->SetWanderDelay(t);
		vread(&t, 4, f);
		vseek(f, 1024, 1);
		/*
		vread(&tlen, 4, f);
		vread(ename, tlen+1, f);
		// chr filename
		vread(&tlen, 4, f);
		vread(chrfn, tlen+1, f);
		// script
		vread(&tlen, 4, f);
		vread(escript, tlen+1, f);
		// movescript
		vread(&tlen, 4, f);
		vread(emovescript, tlen+1, f);

		vread(&tlen, 4, f);
		vread(&tlen, 4, f);
		int eface, speed, tx, ty;
		vread(&eface, 4, f);
		vread(&speed, 4, f);
		vread(&tx, 4, f);
		vread(&ty, 4, f);

		vread(&x1, 4, f);
		vread(&y1, 4, f);
		vread(&x2, 4, f);
		vread(&y2, 4, f);

		int idx = AllocateEntity(tx*16, ty*16, chrfn);
		entity[idx]->setface(eface);
		entity[idx]->setspeed(speed);
		entity[idx]->script = escript;
		entity[idx]->autoface = (eflags & ENT_AUTOFACE) ? true : false;
		entity[idx]->obstructable = (eflags & ENT_OBSTRUCTED) ? true : false;
		entity[idx]->obstruction = (eflags & ENT_OBSTRUCTS) ? true : false;

		if (method == ENT_MOVESCRIPT) entity[idx]->SetMoveScript(emovescript);
		if (method == ENT_WANDERZONE) entity[idx]->SetWanderZone();
		if (method == ENT_WANDERBOX) entity[idx]->SetWanderBox(x1, y1, x2, y2);*/
	}
	current_map = this;
	se->LoadMapScript(f, mapfname);
	vclose(f);
	se->ExecuteFunctionString(startupscript);
}