static void LoadScriptFile (const char *name) { int lumpnum = Wads.CheckNumForName (name); int numnodes, i; DWORD prevSpeakerType; FStrifeDialogueNode *node; FWadLump *lump; if (lumpnum < 0) { return; } numnodes = Wads.LumpLength (lumpnum); if (!(gameinfo.flags & GI_SHAREWARE)) { // Strife scripts are always a multiple of 1516 bytes because each entry // is exactly 1516 bytes long. if (numnodes % 1516 != 0) { return; } numnodes /= 1516; } else { // And the teaser version has 1488-byte entries. if (numnodes % 1488 != 0) { return; } numnodes /= 1488; } lump = Wads.ReopenLumpNum (lumpnum); prevSpeakerType = 0; for (i = 0; i < numnodes; ++i) { if (!(gameinfo.flags & GI_SHAREWARE)) { node = ReadRetailNode (lump, prevSpeakerType); } else { node = ReadTeaserNode (lump, prevSpeakerType); } StrifeDialogues.Push (node); } delete lump; }
static bool LoadScriptFile(int lumpnum, FileReader *lump, int numnodes, bool include, int type) { int i; DWORD prevSpeakerType; FStrifeDialogueNode *node; char buffer[4]; lump->Read(buffer, 4); lump->Seek(-4, SEEK_CUR); // The binary format is so primitive that this check is enough to detect it. bool isbinary = (buffer[0] == 0 || buffer[1] == 0 || buffer[2] == 0 || buffer[3] == 0); if ((type == 1 && !isbinary) || (type == 2 && isbinary)) { DPrintf("Incorrect data format for %s.", Wads.GetLumpFullName(lumpnum)); return false; } if (!isbinary) { P_ParseUSDF(lumpnum, lump, numnodes); } else { if (!include) { LoadScriptFile("SCRIPT00", true, 1); } if (!(gameinfo.flags & GI_SHAREWARE)) { // Strife scripts are always a multiple of 1516 bytes because each entry // is exactly 1516 bytes long. if (numnodes % 1516 != 0) { DPrintf("Incorrect data format for %s.", Wads.GetLumpFullName(lumpnum)); return false; } numnodes /= 1516; } else { // And the teaser version has 1488-byte entries. if (numnodes % 1488 != 0) { DPrintf("Incorrect data format for %s.", Wads.GetLumpFullName(lumpnum)); return false; } numnodes /= 1488; } prevSpeakerType = 0; for (i = 0; i < numnodes; ++i) { if (!(gameinfo.flags & GI_SHAREWARE)) { node = ReadRetailNode (lump, prevSpeakerType); } else { node = ReadTeaserNode (lump, prevSpeakerType); } node->ThisNodeNum = StrifeDialogues.Push(node); } } return true; }