mirror of
https://github.com/isledecomp/SIEdit.git
synced 2025-02-17 00:40:42 -05:00
lib: add write functions for each chunk type
This commit is contained in:
parent
dbdf9097a4
commit
6f8d3d500c
2 changed files with 135 additions and 0 deletions
127
lib/sitypes.cpp
127
lib/sitypes.cpp
|
@ -11,6 +11,11 @@ Data ReadU32(std::ifstream &is)
|
|||
return u;
|
||||
}
|
||||
|
||||
void WriteU32(std::ofstream &os, uint32_t u)
|
||||
{
|
||||
os.write((const char *) &u, sizeof(u));
|
||||
}
|
||||
|
||||
Data ReadU16(std::ifstream &is)
|
||||
{
|
||||
uint16_t u;
|
||||
|
@ -18,6 +23,11 @@ Data ReadU16(std::ifstream &is)
|
|||
return u;
|
||||
}
|
||||
|
||||
void WriteU16(std::ofstream &os, uint16_t u)
|
||||
{
|
||||
os.write((const char *) &u, sizeof(u));
|
||||
}
|
||||
|
||||
Data ReadU8(std::ifstream &is)
|
||||
{
|
||||
uint8_t u;
|
||||
|
@ -25,6 +35,11 @@ Data ReadU8(std::ifstream &is)
|
|||
return u;
|
||||
}
|
||||
|
||||
void WriteU8(std::ofstream &os, uint8_t u)
|
||||
{
|
||||
os.write((const char *) &u, sizeof(u));
|
||||
}
|
||||
|
||||
Data ReadVector3(std::ifstream &is)
|
||||
{
|
||||
Vector3 u;
|
||||
|
@ -32,6 +47,11 @@ Data ReadVector3(std::ifstream &is)
|
|||
return u;
|
||||
}
|
||||
|
||||
void WriteVector3(std::ofstream &os, Vector3 v)
|
||||
{
|
||||
os.write((const char *) &v, sizeof(v));
|
||||
}
|
||||
|
||||
Data ReadString(std::ifstream &is)
|
||||
{
|
||||
bytearray d;
|
||||
|
@ -51,6 +71,21 @@ Data ReadString(std::ifstream &is)
|
|||
return d;
|
||||
}
|
||||
|
||||
void WriteString(std::ofstream &os, const std::string &d)
|
||||
{
|
||||
if (!d.empty()) {
|
||||
// Write every byte that isn't null
|
||||
const char *s = &d[0];
|
||||
while ((*s) != 0) {
|
||||
os.write(s, 1);
|
||||
}
|
||||
}
|
||||
|
||||
// Ensure null terminator
|
||||
const char nullterm = 0;
|
||||
os.write(&nullterm, 1);
|
||||
}
|
||||
|
||||
Data ReadBytes(std::ifstream &is, size_t size)
|
||||
{
|
||||
bytearray d;
|
||||
|
@ -61,11 +96,21 @@ Data ReadBytes(std::ifstream &is, size_t size)
|
|||
return d;
|
||||
}
|
||||
|
||||
void WriteBytes(std::ofstream &os, const bytearray &ba)
|
||||
{
|
||||
os.write(ba.data(), ba.size());
|
||||
}
|
||||
|
||||
void RIFF::Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size)
|
||||
{
|
||||
data["Format"] = ReadU32(is);
|
||||
}
|
||||
|
||||
void RIFF::Write(std::ofstream &os, const DataMap &data, uint32_t version)
|
||||
{
|
||||
WriteU32(os, data.at("Format"));
|
||||
}
|
||||
|
||||
void LIST::Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size)
|
||||
{
|
||||
data["Format"] = ReadU32(is);
|
||||
|
@ -75,11 +120,25 @@ void LIST::Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t siz
|
|||
}
|
||||
}
|
||||
|
||||
void LIST::Write(std::ofstream &os, const DataMap &data, uint32_t version)
|
||||
{
|
||||
WriteU32(os, data.at("Format"));
|
||||
|
||||
if (data.at("Format") == Chunk::TYPE_MxCh) {
|
||||
WriteU32(os, data.at("Count"));
|
||||
}
|
||||
}
|
||||
|
||||
void MxSt::Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size)
|
||||
{
|
||||
// MxSt is a container type only and has no members, so nothing needs to be done here
|
||||
}
|
||||
|
||||
void MxSt::Write(std::ofstream &os, const DataMap &data, uint32_t version)
|
||||
{
|
||||
// MxSt is a container type only and has no members, so nothing needs to be done here
|
||||
}
|
||||
|
||||
void MxHd::Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size)
|
||||
{
|
||||
Data v = ReadU32(is);
|
||||
|
@ -88,6 +147,13 @@ void MxHd::Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t siz
|
|||
data["BufferCount"] = ReadU32(is);
|
||||
}
|
||||
|
||||
void MxHd::Write(std::ofstream &os, const DataMap &data, uint32_t version)
|
||||
{
|
||||
WriteU32(os, data.at("Version"));
|
||||
WriteU32(os, data.at("BufferSize"));
|
||||
WriteU32(os, data.at("BufferCount"));
|
||||
}
|
||||
|
||||
void MxCh::Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size)
|
||||
{
|
||||
data["Flags"] = ReadU16(is);
|
||||
|
@ -97,17 +163,40 @@ void MxCh::Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t siz
|
|||
data["Data"] = ReadBytes(is, size - 0xE);
|
||||
}
|
||||
|
||||
void MxCh::Write(std::ofstream &os, const DataMap &data, uint32_t version)
|
||||
{
|
||||
WriteU16(os, data.at("Flags"));
|
||||
WriteU32(os, data.at("Object"));
|
||||
WriteU32(os, data.at("Time"));
|
||||
WriteU32(os, data.at("DataSize"));
|
||||
WriteBytes(os, data.at("Data"));
|
||||
}
|
||||
|
||||
void MxOf::Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size)
|
||||
{
|
||||
data["Count"] = ReadU32(is);
|
||||
data["Offsets"] = ReadBytes(is, size - sizeof(uint32_t));
|
||||
}
|
||||
|
||||
void MxOf::Write(std::ofstream &os, const DataMap &data, uint32_t version)
|
||||
{
|
||||
WriteU32(os, data.at("Count"));
|
||||
WriteBytes(os, data.at("Offsets"));
|
||||
}
|
||||
|
||||
void pad_::Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size)
|
||||
{
|
||||
is.seekg(size, std::ios::cur);
|
||||
}
|
||||
|
||||
void pad_::WritePadding(std::ofstream &os, size_t size)
|
||||
{
|
||||
bytearray b;
|
||||
b.resize(size);
|
||||
b.fill(0xCD);
|
||||
WriteBytes(os, b);
|
||||
}
|
||||
|
||||
const char *MxOb::GetTypeName(Type type)
|
||||
{
|
||||
switch (type) {
|
||||
|
@ -199,4 +288,42 @@ void MxOb::Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t siz
|
|||
}
|
||||
}
|
||||
|
||||
void MxOb::Write(std::ofstream &os, const DataMap &data, uint32_t version)
|
||||
{
|
||||
const Data &obj_type = data.at("Type");
|
||||
WriteU16(os, obj_type);
|
||||
WriteString(os, data.at("Presenter"));
|
||||
WriteU32(os, data.at("Unknown1"));
|
||||
WriteString(os, data.at("Name"));
|
||||
WriteU32(os, data.at("ID"));
|
||||
WriteU32(os, data.at("Flags"));
|
||||
WriteU32(os, data.at("Unknown4"));
|
||||
WriteU32(os, data.at("Duration"));
|
||||
WriteU32(os, data.at("Loops"));
|
||||
WriteVector3(os, data.at("Position"));
|
||||
WriteVector3(os, data.at("Direction"));
|
||||
WriteVector3(os, data.at("Up"));
|
||||
|
||||
const Data &extra = data.at("ExtraData");
|
||||
WriteU16(os, extra.size());
|
||||
WriteBytes(os, extra);
|
||||
|
||||
if (obj_type != Presenter && obj_type != World) {
|
||||
WriteString(os, data.at("FileName"));
|
||||
|
||||
WriteU32(os, data.at("Unknown26"));
|
||||
WriteU32(os, data.at("Unknown27"));
|
||||
WriteU32(os, data.at("Unknown28"));
|
||||
|
||||
WriteU32(os, data.at("FileType"));
|
||||
|
||||
WriteU32(os, data.at("Unknown29"));
|
||||
WriteU32(os, data.at("Unknown30"));
|
||||
|
||||
if (obj_type == MxOb::Sound) {
|
||||
WriteU32(os, data.at("Unknown31"));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -21,6 +21,7 @@ public:
|
|||
virtual ~RIFF(){}
|
||||
|
||||
virtual void Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size);
|
||||
virtual void Write(std::ofstream &os, const DataMap &data, uint32_t version);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -35,6 +36,7 @@ class LIST : public RIFF
|
|||
{
|
||||
public:
|
||||
virtual void Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size);
|
||||
virtual void Write(std::ofstream &os, const DataMap &data, uint32_t version);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -50,6 +52,7 @@ class MxHd : public RIFF
|
|||
{
|
||||
public:
|
||||
virtual void Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size);
|
||||
virtual void Write(std::ofstream &os, const DataMap &data, uint32_t version);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -61,6 +64,7 @@ class MxSt : public RIFF
|
|||
{
|
||||
public:
|
||||
virtual void Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size);
|
||||
virtual void Write(std::ofstream &os, const DataMap &data, uint32_t version);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -78,6 +82,7 @@ class MxCh : public RIFF
|
|||
{
|
||||
public:
|
||||
virtual void Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size);
|
||||
virtual void Write(std::ofstream &os, const DataMap &data, uint32_t version);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -92,6 +97,7 @@ class MxOf : public RIFF
|
|||
{
|
||||
public:
|
||||
virtual void Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size);
|
||||
virtual void Write(std::ofstream &os, const DataMap &data, uint32_t version);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -104,6 +110,7 @@ class pad_ : public RIFF
|
|||
{
|
||||
public:
|
||||
virtual void Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size);
|
||||
void WritePadding(std::ofstream &os, size_t size);
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -203,6 +210,7 @@ public:
|
|||
LIBWEAVER_EXPORT static std::vector<const char*> GetFlagsName(Flags flags);
|
||||
|
||||
virtual void Read(std::ifstream &is, DataMap &data, uint32_t version, uint32_t size);
|
||||
virtual void Write(std::ofstream &os, const DataMap &data, uint32_t version);
|
||||
};
|
||||
|
||||
class WAVFormatHeader
|
||||
|
|
Loading…
Reference in a new issue