private static string GetIntegerString(IEnumerator <Token> e, bool allowNegative = true) { e.AssertTokenType("integer", allowNegative ? new[] { TokenType.Integer, TokenType.Subtract } : new[] { TokenType.Integer } ); string text; bool negate = e.Current.Type == TokenType.Subtract; if (negate) { e.AssertTokenType("integer", TokenType.Integer); text = "-" + e.Current.Value; } else { text = e.Current.Value; } return(text); }
public HMessage Compose(IEnumerator <Token> e, bool isOutgoing, bool consumeToken = true) { if (Game == null) { throw new Exception("The game has not been disassembled, unable to parse packet"); } ushort header; if (consumeToken) { e.AssertTokenType("header", new[] { TokenType.Integer, TokenType.Identifier }); } else { e.Current.AssertTokenType("header", new[] { TokenType.Integer, TokenType.Identifier }); } if (e.Current.Type == TokenType.Integer) { header = ushort.Parse(e.Current.Value); } else { string messageName = e.Current.Value; var identifiers = isOutgoing ? (Identifiers)Out : In; if (!identifiers.TryGetId(messageName, out header)) { throw new Exception($"Unknown {(isOutgoing ? "outgoing" : "incoming")} message name: {messageName}"); } } var packet = new HMessage(header); while (e.MoveNext()) { if (e.Current.Type == TokenType.NewLine || e.Current.Type == TokenType.SequenceTerminator) { break; } switch (e.Current.Type) { case TokenType.Identifier: { var identifier = e.Current.Value.ToLower(); switch (identifier) { case "true": packet.WriteBoolean(true); break; case "false": packet.WriteBoolean(false); break; case "b": // byte { e.AssertTokenType("':'", TokenType.Colon); byte[] bytes = new byte[1] { e.ParseByte() }; packet.WriteBytes(bytes); } break; case "s": // short { e.AssertTokenType("':'", TokenType.Colon); packet.WriteShort((ushort)e.ParseShort()); } break; case "i": // int { e.AssertTokenType("':'", TokenType.Colon); packet.WriteInteger(e.ParseInt()); } break; case "a": // byte array { e.AssertTokenType("':'", TokenType.Colon); byte[] bytes = e.ParseByteArray(); packet.WriteInteger(bytes.Length); packet.WriteBytes(bytes); } break; default: throw new Exception($"Unexpected identifier '{identifier}'"); } } break; case TokenType.Subtract: case TokenType.Integer: { bool negate = e.Current.Type == TokenType.Subtract; if (negate) { e.AssertTokenType("integer", TokenType.Integer); } var s = (negate ? "-" : "") + e.Current.Value; if (!int.TryParse(s, out int value)) { throw new Exception($"Invalid integer value: {s}"); } packet.WriteInteger(value); } break; case TokenType.String: packet.WriteString(e.Current.Value); break; case TokenType.ByteArray: { byte[] bytes = ParserExtensions.ParseByteArray(e.Current); packet.WriteBytes(bytes); } break; case TokenType.NewLine: break; default: throw new Exception($"Unexpected token type {e.Current.Type}"); } } return(packet); }