// ----------------------------------------------------------------------------- // Parses all statements/blocks in [entry], adding them to [parsed] // ----------------------------------------------------------------------------- void parseBlocks(ArchiveEntry* entry, vector<ParsedStatement>& parsed) { Tokenizer tz; tz.setSpecialCharacters(CHR(Tokenizer::DEFAULT_SPECIAL_CHARACTERS + "()+-[]&!?.")); tz.enableDecorate(true); tz.setCommentTypes(Tokenizer::CommentTypes::CPPStyle | Tokenizer::CommentTypes::CStyle); tz.openMem(entry->getMCData(), "ZScript"); // Log::info(2, S_FMT("Parsing ZScript entry \"%s\"", entry->getPath(true))); while (!tz.atEnd()) { // Preprocessor if (tz.current().text.StartsWith("#")) { if (tz.checkNC("#include")) { auto inc_entry = entry->relativeEntry(tz.next().text); // Check #include path could be resolved if (!inc_entry) { Log::warning(S_FMT( "Warning parsing ZScript entry %s: " "Unable to find #included entry \"%s\" at line %u, skipping", CHR(entry->getName()), CHR(tz.current().text), tz.current().line_no)); } else parseBlocks(inc_entry, parsed); } tz.advToNextLine(); continue; } // Version else if (tz.checkNC("version")) { tz.advToNextLine(); continue; } // ZScript parsed.push_back({}); parsed.back().entry = entry; if (!parsed.back().parse(tz)) parsed.pop_back(); } // Set entry type if (etype_zscript && entry->getType() != etype_zscript) entry->setType(etype_zscript); }
/* MapSpecials::processACSScripts * Process 'OPEN' ACS scripts for various specials - sector colours, * slopes, etc. *******************************************************************/ void MapSpecials::processACSScripts(ArchiveEntry* entry) { sector_colours.clear(); sector_fadecolours.clear(); if (!entry || entry->getSize() == 0) return; Tokenizer tz; tz.setSpecialCharacters(";,:|={}/()"); tz.openMem(entry->getMCData(), "ACS Scripts"); while (!tz.atEnd()) { if (tz.checkNC("script")) { LOG_MESSAGE(3, "script found"); tz.adv(2); // Skip script # // Check for open script if (tz.checkNC("OPEN")) { LOG_MESSAGE(3, "script is OPEN"); // Skip to opening brace while (!tz.check("{")) tz.adv(); // Parse script while (!tz.checkOrEnd("}")) { // --- Sector_SetColor --- if (tz.checkNC("Sector_SetColor")) { // Get parameters auto parameters = tz.getTokensUntil(")"); // Parse parameters long val; int tag = -1; int r = -1; int g = -1; int b = -1; for (unsigned a = 0; a < parameters.size(); a++) { if (parameters[a].text.ToLong(&val)) { if (tag < 0) tag = val; else if (r < 0) r = val; else if (g < 0) g = val; else if (b < 0) b = val; } } // Check everything is set if (b < 0) { LOG_MESSAGE(2, "Invalid Sector_SetColor parameters"); } else { sector_colour_t sc; sc.tag = tag; sc.colour.set(r, g, b, 255); LOG_MESSAGE(3, "Sector tag %d, colour %d,%d,%d", tag, r, g, b); sector_colours.push_back(sc); } } // --- Sector_SetFade --- else if (tz.checkNC("Sector_SetFade")) { // Get parameters auto parameters = tz.getTokensUntil(")"); // Parse parameters long val; int tag = -1; int r = -1; int g = -1; int b = -1; for (unsigned a = 0; a < parameters.size(); a++) { if (parameters[a].text.ToLong(&val)) { if (tag < 0) tag = val; else if (r < 0) r = val; else if (g < 0) g = val; else if (b < 0) b = val; } } // Check everything is set if (b < 0) { LOG_MESSAGE(2, "Invalid Sector_SetFade parameters"); } else { sector_colour_t sc; sc.tag = tag; sc.colour.set(r, g, b, 0); LOG_MESSAGE(3, "Sector tag %d, fade colour %d,%d,%d", tag, r, g, b); sector_fadecolours.push_back(sc); } } tz.adv(); } } } tz.adv(); } }
// ----------------------------------------------------------------------------- // Reads in a ZDoom-format TEXTURES entry. // Returns true on success, false otherwise // ----------------------------------------------------------------------------- bool TextureXList::readTEXTURESData(ArchiveEntry* textures) { // Check for empty entry if (!textures) { Global::error = "Attempt to read texture data from NULL entry"; return false; } if (textures->size() == 0) { txformat_ = Format::Textures; return true; } // Get text to parse Tokenizer tz; tz.openMem(textures->data(), textures->name()); // Parsing gogo while (!tz.atEnd()) { // Texture definition if (tz.checkNC("Texture")) { auto tex = std::make_unique<CTexture>(); if (tex->parse(tz, "Texture")) addTexture(std::move(tex)); } // Sprite definition else if (tz.checkNC("Sprite")) { auto tex = std::make_unique<CTexture>(); if (tex->parse(tz, "Sprite")) addTexture(std::move(tex)); } // Graphic definition else if (tz.checkNC("Graphic")) { auto tex = std::make_unique<CTexture>(); if (tex->parse(tz, "Graphic")) addTexture(std::move(tex)); } // WallTexture definition else if (tz.checkNC("WallTexture")) { auto tex = std::make_unique<CTexture>(); if (tex->parse(tz, "WallTexture")) addTexture(std::move(tex)); } // Flat definition else if (tz.checkNC("Flat")) { auto tex = std::make_unique<CTexture>(); if (tex->parse(tz, "Flat")) addTexture(std::move(tex)); } // Old HIRESTEX "Define" else if (tz.checkNC("Define")) { auto tex = std::make_unique<CTexture>(); if (tex->parseDefine(tz)) addTexture(std::move(tex)); } tz.adv(); } txformat_ = Format::Textures; return true; }