private void SerializeEffect(string[] tokens, StreamReader reader, BinaryWriter binaryWriter) { while (!reader.EndOfStream) { tokens = reader.ReadLine().Split(Utilities.SplitCharacters, StringSplitOptions.RemoveEmptyEntries); string macroName = tokens[0]; if (macroName == "fxdone") { binaryWriter.Write((byte)this.doneOpcode); break; } FxMacroDefinition macroDefinition = this.macroDefinitionTable.MacroDefinitions .Values .FirstOrDefault(x => x.Name.Equals(macroName, StringComparison.OrdinalIgnoreCase) && x.FxDefGroup.Count() == tokens[1..].Length); binaryWriter.Write((byte)macroDefinition.Opcode); if (macroDefinition == null) { throw new InvalidOperationException("Unknown macro '{macroName}'"); } var parameters = new List <object>(); int parameterIndex = 1; foreach (var line in macroDefinition.FxDefGroup) { if (line is DataDefinitionMacroLine dataDefinitionMacroLine) { dataDefinitionMacroLine.Serialize(tokens[parameterIndex++], this.macroDefinitionTable.SymbolTable, binaryWriter); } } } }
private void ProcessMacroDefinitions(IList <MacroDefinition> macroDefinitions) { // Try to map each opcode we know about to a pre-processed form of the macro definition with conditional branches eliminated foreach (int opcode in this.SymbolTable.GetSymbolGroup(KnownSymbolGroupNames.Fx).Values) { FxMacroDefinition fxMacroDefinition = this.GetFxMacroDefinition(macroDefinitions, opcode); if (fxMacroDefinition != null) { this.MacroDefinitions[opcode] = fxMacroDefinition; } else { logger.Warn($"Opcode {opcode} has no macro defined"); } } }