[XBox360] Dynasty Warriors 8 (Early Access)

Release and comment on game extractors and other tools here.

Moderators: Dazzy, semory

User avatar
semory
Site Admin
Posts: 7755
Joined: Sat Aug 04, 2012 7:38 pm
Custom Rank: Kitty pu tu tu lay!
Location: Torrance, CA

Re: [XBox360] Dynasty Warriors 8 (Early Access)

Post by semory »

oh and here is my testing code for the data i sent you. sorry it's not python, but it should be easy to follow.

Code: Select all

bool TestNUNO(void)
{
 // pathnames
 using namespace std;
 STDSTRING pathname = TEXT("X:\\WORKSPACE\\[PS3] Sengoku Musou 4\\LINKDATA_B_CHARS\\7834\\");
 STDSTRING savepath = TEXT("X:\\WORKSPACE\\[PS3] Sengoku Musou 4\\LINKDATA_B_CHARS\\7834\\");

 // control point filename
 STDSTRING cpf_name = pathname;
 cpf_name += TEXT("nuno1_cp.bin");

 // influence data filename
 STDSTRING inf_name = pathname;
 inf_name += TEXT("nuno1_inf.bin");

 // vertex buffer filename
 STDSTRING vbf_name = pathname;
 vbf_name += TEXT("vbuffer1.bin");

 // properties
 uint32 n_cp = 0x23; // number of control points
 uint32 n_verts = 0x60; // number of vertices
 uint32 vtxsize = 0x7C; // vertex size in bytes
 uint32 offset1 = 0x00; // vertex offset #1
 uint32 offset2 = 0x10; // vertex offset #2
 uint32 offset3 = 0x24; // vertex offset #3
 uint32 offset4 = 0x34; // vertex offset #4
 uint32 offset5 = 0x44; // vertex offset #5 (indices)

 //
 // create output file
 //

 STDSTRING ofname = pathname;
 ofname += TEXT("output.obj");
 ofstream ofile(ofname.c_str());
 if(!ofile) return error("Failed to create output file.");

 // output obj header
 ofile << "o output" << endl;
 ofile << endl;

 //
 // read control point data
 //

 boost::shared_array<boost::shared_array<real32>> cp_data;
 cp_data.reset(new boost::shared_array<real32>[n_cp]);

 // open control point file
 ifstream cpf(cpf_name.c_str(), ios::binary);
 if(!cpf) return error("Failed to open file.");

 for(uint32 i = 0; i < n_cp; i++) {
     cp_data[i].reset(new real32[4]);
     if(!BE_read_array(cpf, cp_data[i].get(), 4)) return error("Read failure.");
    }

 //
 // read vertex data
 //

 uint32 vb_size = n_verts * vtxsize;
 boost::shared_array<char> vb_data(new char[vb_size]);

 // open vertex buffer file
 ifstream vbf(vbf_name.c_str(), ios::binary);
 if(!vbf) return error("Failed to open file.");

 // read vertex buffer data
 vbf.read(vb_data.get(), vb_size);
 if(vbf.fail()) return error("Read failure.");

 // create vertex buffer stream
 binary_stream bs(vb_data, vb_size);
 uint32 position = 0;

 // read vertex buffer data
 for(uint32 i = 0; i < n_verts; i++)
    {
     // move to offset #1
     bs.seek(position + offset1);
     if(bs.fail()) return error("Stream seek failure.");

     // read vector
     real32 v1[4];
     bs.BE_read_array(&v1[0], 4);
     if(bs.fail()) return error("Stream read failure.");

     // move to offset #2
     bs.seek(position + offset2);
     if(bs.fail()) return error("Stream seek failure.");

     // read vector
     real32 v2[4];
     bs.BE_read_array(&v2[0], 4);
     if(bs.fail()) return error("Stream read failure.");

     // move to offset #3
     bs.seek(position + offset3);
     if(bs.fail()) return error("Stream seek failure.");

     // read vector
     real32 v3[4];
     bs.BE_read_array(&v3[0], 4);
     if(bs.fail()) return error("Stream read failure.");

     // move to offset #4
     bs.seek(position + offset4);
     if(bs.fail()) return error("Stream seek failure.");

     // read vector
     real32 v4[4];
     bs.BE_read_array(&v4[0], 4);
     if(bs.fail()) return error("Stream read failure.");

     // move to offset #5
     bs.seek(position + offset5);
     if(bs.fail()) return error("Stream seek failure.");

     // read indices
     uint08 i1[4]; bs.BE_read_array(&i1[0], 4);
     uint08 i2[4]; bs.BE_read_array(&i2[0], 4);
     uint08 i3[4]; bs.BE_read_array(&i3[0], 4);
     uint08 i4[4]; bs.BE_read_array(&i4[0], 4);
     if(bs.fail()) return error("Stream seek failure.");

     // determine if anchor point
     bool is_anchor = ((v3[0] == 0.0f) && (v3[1] == 0.0f) &&
                       (v3[2] == 0.0f) && (v3[3] == 0.0f));

     // anchor point
     if(is_anchor)
       {
        ofile << "v " << v1[0] << " " << v1[1] << " " << v1[2] << endl;
       }
     // non-anchor point
     else
       {
        // first control point index set
        uint32 cpidx1 = i1[0];
        uint32 cpidx2 = i1[1];
        uint32 cpidx3 = i1[2];
        uint32 cpidx4 = i1[3];

        // first control point set
        auto cp1 = cp_data[cpidx1];
        auto cp2 = cp_data[cpidx2];
        auto cp3 = cp_data[cpidx3];
        auto cp4 = cp_data[cpidx4];

        // cp1 * v1[0] + cp2 * v1[1]
        real32 x = (cp1[0] * v1[0]) + (cp2[0] * v1[1]) + (cp3[0] * v1[2]) + (cp4[0] * v1[3]);
        real32 y = (cp1[1] * v1[0]) + (cp2[1] * v1[1]) + (cp3[1] * v1[2]) + (cp4[1] * v1[3]);
        real32 z = (cp1[2] * v1[0]) + (cp2[2] * v1[1]) + (cp3[2] * v1[2]) + (cp4[2] * v1[3]);
        real32 w = (cp1[3] * v1[0]) + (cp2[3] * v1[1]) + (cp3[3] * v1[2]) + (cp4[3] * v1[3]);

        ofile << "v " << x << " " << y << " " << z << endl;
        cout << "v " << x << " " << y << " " << z << " " << w << endl;
       }

     // update position
     position += vtxsize;
    }

 return true;
}

};

#endif
User avatar
semory
Site Admin
Posts: 7755
Joined: Sat Aug 04, 2012 7:38 pm
Custom Rank: Kitty pu tu tu lay!
Location: Torrance, CA

Re: [XBox360] Dynasty Warriors 8 (Early Access)

Post by semory »

BTW, how easy is it to extract the G1M files from DW8:XL Steam version? Is there a tool for it? I might buy the game if it is possible to modify certain things like data in G1M files. It would help a lot. But if the stuff is zlibbed and repacking is hard or impossible, screw it lol.
User avatar
semory
Site Admin
Posts: 7755
Joined: Sat Aug 04, 2012 7:38 pm
Custom Rank: Kitty pu tu tu lay!
Location: Torrance, CA

Re: [XBox360] Dynasty Warriors 8 (Early Access)

Post by semory »

He he he at one time I was even thinking about e-mailing Hideyuki Kan (the lead programmer) for hints but he is not a public figure like say Katsuhiro Harada is from Tekken.
SaintLouisX
Posts: 16
Joined: Wed Jun 04, 2014 10:04 pm
Custom Rank: Aaaa

Re: [XBox360] Dynasty Warriors 8 (Early Access)

Post by SaintLouisX »

It's easy, I made tools for extracting/importing files a long time ago. Including full unzipping and re-zipping and extracting all textures from the game (didn't include models, but that's easy to add in). Your one should work too if you just reversed the endian. I don't change the filenames to add its extension though, or split the files into separate folders or anything like that. That may be useful, but looking around a whole bunch of folders for specific file numbers and seeing where data changes happen is harder when the files are split up.

extract: http://pastebin.com/Bx93uZ7C - Run it from the same folder as LINKDATAs. Specify any argument to have it extract textures.
import: http://pastebin.com/pRKVSDji - Run it from the same folder as LINKDATAs, specify the folder to import files from. Files should be named with their file num, can be . anything.

They should work for any DW game. If you reverse the endians for the unpacks then you can use it for console too. Although for the import you would need to edit the file split locations.

I did have to disable the re-zipping for importing because it was making the game crash. The code itself works perfectly fine, it's just because of the first dword of the file. I *think* it's the output buffer, but for re-importing I just zipped the whole file and set that dword to be the nearest 0x10000, but unfortunately that was causing me divide by zero errors on some files. Some worked, some made the game crashed, so yeah dunno. I was planning to re-write it to split the file into streams of smaller sizes like the game has, but I don't know the criteria they have for splitting the file up.

Either way it's not needed, you can just specify the zip qword to be 0x0 in the index, but it's there if you figure out that first dword.

Suzumiya's tool can also view models, partly: http://i.imgur.com/LwDeG5a.jpg

It can't export/import models, but you can export/import any textures really easily.
User avatar
semory
Site Admin
Posts: 7755
Joined: Sat Aug 04, 2012 7:38 pm
Custom Rank: Kitty pu tu tu lay!
Location: Torrance, CA

Re: [XBox360] Dynasty Warriors 8 (Early Access)

Post by semory »

awesome thanks. i think i will pick up the pc version of game but not right now funds are low lol (anniversary vacation this week and beach hotels are expensive lmao).
User avatar
iheartibuki
Moderator
Posts: 6552
Joined: Sun Aug 19, 2012 9:59 am
Custom Rank: Fappy Bird
Location: The Land of the Free
Contact:

Re: [XBox360] Dynasty Warriors 8 (Early Access)

Post by iheartibuki »

I smell some cheeky pow pow! :ggl: :LOL:
"TheyÔÇÖre not only moron but also Galapagosian Lolita Complexed Chicken."

havie
Posts: 19
Joined: Thu Jan 21, 2016 4:35 pm

Re: [XBox360] Dynasty Warriors 8 (Early Access)

Post by havie »

semory wrote:For all members of the Porters group, here is early access to Dynasty Warriors 8. Note that this ripper only works with the XBox360 version of the game and not the PS3 version (yet).

Questions and comments go here for now. In a couple weeks, after testing, I will make this download public for everyone.

Instructions:

1. Use the same password used for the Warriors Orochi 3 download.
2. Place the exe and dll file in the same directory where the LINKDATA.IDX files are.
3. Run the exe.
4. Come back an hour later.
5. Use Noesis to browse through OBJ files.
6. If you see something you like, use the SMC import script to load the model and bones.

Models are in folders 0018 - 1749.
Some miscellaneous weapon models are in folders 6704 - 6754.

Thanks to all those interested who help test before my releases,
Steven

the DW8extract.7z says its archive is corrupt?
Post Reply