From: <js...@us...> - 2004-09-06 04:58:23
|
Update of /cvsroot/exult/exult In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv11683 Modified Files: ChangeLog gamemap.cc gamemap.h Log Message: Working on extended ifix entries Index: ChangeLog =================================================================== RCS file: /cvsroot/exult/exult/ChangeLog,v retrieving revision 1.1898 retrieving revision 1.1899 diff -u -d -r1.1898 -r1.1899 --- ChangeLog 29 Aug 2004 07:21:00 -0000 1.1898 +++ ChangeLog 6 Sep 2004 04:58:11 -0000 1.1899 @@ -1,3 +1,8 @@ +2004-09-05 <je...@mi...> + + * gamemap.cc: Added code to read Vers.2 entries (although we don't + write them yet). + 2004-08-29 <je...@mi...> * shapes/shapevga.cc (Shapes_vga_file): Resize 'info' list when a Index: gamemap.cc =================================================================== RCS file: /cvsroot/exult/exult/gamemap.cc,v retrieving revision 1.58 retrieving revision 1.59 diff -u -d -r1.58 -r1.59 --- gamemap.cc 5 Sep 2004 05:38:29 -0000 1.58 +++ gamemap.cc 6 Sep 2004 04:58:12 -0000 1.59 @@ -589,6 +589,8 @@ endl; return; } + Flex flex(fname); + int vers = (int) flex.get_vers(); StreamDataSource ifix(&ifix_stream); int scy = 16*(schunk/12); // Get abs. chunk coords. int scx = 16*(schunk%12); @@ -598,14 +600,11 @@ { // Get to index entry for chunk. int chunk_num = cy*16 + cx; - ifix.seek(0x80 + chunk_num*8); - // Get location, length. - long shapesoff = ifix.read4(); - if (!shapesoff) // Nothing there? - continue; - unsigned long shapeslen = ifix.read4(); - get_ifix_chunk_objects(&ifix, shapesoff, shapeslen/4, - scx + cx, scy + cy); + size_t len; + uint32 offset = flex.get_entry_info(chunk_num, len); + if (len) + get_ifix_chunk_objects(&ifix, vers, offset, + len, scx + cx, scy + cy); } } @@ -616,34 +615,53 @@ void Game_map::get_ifix_chunk_objects ( DataSource* ifix, - long filepos, // Where chunk's data lies. - int cnt, // # entries (objects). + int vers, // Flex file vers. + long filepos, // Offset in file. + int len, // Length of data. int cx, int cy // Absolute chunk #'s. ) { + Ifix_game_object *obj; Game_window *gwin = Game_window::get_instance(); ifix->seek(filepos); // Get to actual shape. // Get buffer to hold entries' indices. - unsigned char *entries = new unsigned char[4*cnt]; + unsigned char *entries = new unsigned char[len]; unsigned char *ent = entries; // Read them in. - ifix->read(reinterpret_cast<char*>(entries), 4*cnt); + ifix->read(reinterpret_cast<char*>(entries), len); // Get object list for chunk. Map_chunk *olist = get_chunk(cx, cy); - for (int i = 0; i < cnt; i++, ent += 4) + if ((Flex::Flex_vers)vers == Flex::orig) { - Ifix_game_object *obj; - int tx = (ent[0]>>4)&0xf, ty = ent[0]&0xf, lift = ent[1] & 0xf; - int shnum = ent[2]+256*(ent[3]&3); - int frnum = ent[3]>>2; - Shape_info& info = ShapeID::get_info(shnum); - if (info.is_animated() || info.has_sfx()) - obj = new Animated_ifix_object(shnum, frnum, tx, ty, - lift); - else - obj = new Ifix_game_object(shnum, frnum, tx, ty, lift); - - olist->add(obj); + int cnt = len/4; + for (int i = 0; i < cnt; i++, ent += 4) + { + int tx = (ent[0]>>4)&0xf, ty = ent[0]&0xf, + tz = ent[1] & 0xf; + int shnum = ent[2]+256*(ent[3]&3), frnum = ent[3]>>2; + Shape_info& info = ShapeID::get_info(shnum); + obj = (info.is_animated() || info.has_sfx()) ? + new Animated_ifix_object(shnum, frnum,tx, ty, tz) + : new Ifix_game_object(shnum, frnum, tx, ty, tz); + olist->add(obj); + } } + else if ((Flex::Flex_vers)vers == Flex::exult_v2) + { // b0 = tx,ty, b1 = lift, b2-3 = shnum, b4=frnum + int cnt = len/5; + for (int i = 0; i < cnt; i++, ent += 5) + { + int tx = (ent[0]>>4)&0xf, ty = ent[0]&0xf, + tz = ent[1] & 0xf; + int shnum = ent[2]+256*ent[3], frnum = ent[4]; + Shape_info& info = ShapeID::get_info(shnum); + obj = (info.is_animated() || info.has_sfx()) ? + new Animated_ifix_object(shnum, frnum,tx, ty, tz) + : new Ifix_game_object(shnum, frnum, tx, ty, tz); + olist->add(obj); + } + } + else + assert(0); delete[] entries; // Done with buffer. olist->setup_dungeon_levels(); // Should have all dungeon pieces now. } Index: gamemap.h =================================================================== RCS file: /cvsroot/exult/exult/gamemap.h,v retrieving revision 1.19 retrieving revision 1.20 diff -u -d -r1.19 -r1.20 --- gamemap.h 28 Aug 2004 05:36:03 -0000 1.19 +++ gamemap.h 6 Sep 2004 04:58:12 -0000 1.20 @@ -142,8 +142,8 @@ // Get "ifix" objects for a superchunk. void get_ifix_objects(int schunk); // Get "ifix" objs. for given chunk. - void get_ifix_chunk_objects(DataSource* ifix, long filepos, int cnt, - int cx, int cy); + void get_ifix_chunk_objects(DataSource* ifix, int vers, + long filepos, int len, int cx, int cy); // Write scheduled script for obj. static void write_scheduled(DataSource* ireg, Game_object *obj, bool write_mark = false); |