/****************************** code ******************************/ Layer::Layer(VFILE *f) { lucent = 0; width = height = 0; vread(layername, 256, f); vread(¶llax_x, 8, f); vread(¶llax_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 }
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); }
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); }