diff --git a/dof/buf.gen.yaml b/dof/buf.gen.yaml
index e5f04ae..6231c46 100644
--- a/dof/buf.gen.yaml
+++ b/dof/buf.gen.yaml
@@ -2,3 +2,5 @@ version: v1
 plugins:
   - plugin: buf.build/protocolbuffers/go
     out: go
+  - plugin: buf.build/protocolbuffers/csharp
+    out: csharp
diff --git a/dof/csharp/Messages.cs b/dof/csharp/Messages.cs
new file mode 100644
index 0000000..5585ba1
--- /dev/null
+++ b/dof/csharp/Messages.cs
@@ -0,0 +1,3525 @@
+// 
+//     Generated by the protocol buffer compiler.  DO NOT EDIT!
+//     source: dof/messages.proto
+// 
+#pragma warning disable 1591, 0612, 3021, 8981
+#region Designer generated code
+
+using pb = global::Google.Protobuf;
+using pbc = global::Google.Protobuf.Collections;
+using pbr = global::Google.Protobuf.Reflection;
+using scg = global::System.Collections.Generic;
+namespace Dof {
+
+  /// Holder for reflection information generated from dof/messages.proto
+  public static partial class MessagesReflection {
+
+    #region Descriptor
+    /// File descriptor for dof/messages.proto
+    public static pbr::FileDescriptor Descriptor {
+      get { return descriptor; }
+    }
+    private static pbr::FileDescriptor descriptor;
+
+    static MessagesReflection() {
+      byte[] descriptorData = global::System.Convert.FromBase64String(
+          string.Concat(
+            "ChJkb2YvbWVzc2FnZXMucHJvdG8SA2RvZiIkChBDbGllbnRJbml0aWFsaXpl",
+            "EhAKA2NpZBgBIAEoA1IDY2lkIt4CCg1DbGllbnRNZXNzYWdlEjUKDHBsYXll",
+            "cl9lbnRlchgBIAEoCzIQLmRvZi5QbGF5ZXJFbnRlckgAUgtwbGF5ZXJFbnRl",
+            "chI7Cg5sZXZlbF9wcmVwYXJlZBgCIAEoCzISLmRvZi5MZXZlbFByZXBhcmVk",
+            "SABSDWxldmVsUHJlcGFyZWQSMgoLcG9pbnRfZm91bmQYAyABKAsyDy5kb2Yu",
+            "UG9pbnRGb3VuZEgAUgpwb2ludEZvdW5kEiwKCWxldmVsX2VuZBgEIAEoCzIN",
+            "LmRvZi5MZXZlbEVuZEgAUghsZXZlbEVuZBI2Cg1hbGxfbGV2ZWxfZW5kGAUg",
+            "ASgLMhAuZG9mLkFsbExldmVsRW5kSABSC2FsbExldmVsRW5kEjUKDHBsYXll",
+            "cl9sZWF2ZRgGIAEoCzIQLmRvZi5QbGF5ZXJMZWF2ZUgAUgtwbGF5ZXJMZWF2",
+            "ZUIICgZhY3R1YWwi5gEKDVNlcnZlck1lc3NhZ2USLwoKZ2FtZV9zdGFydBgB",
+            "IAEoCzIOLmRvZi5HYW1lU3RhcnRIAFIJZ2FtZVN0YXJ0EjIKC2xldmVsX3N0",
+            "YXJ0GAIgASgLMg8uZG9mLkxldmVsU3RhcnRIAFIKbGV2ZWxTdGFydBIyCgtw",
+            "b2ludF9mb3VuZBgDIAEoCzIPLmRvZi5Qb2ludEZvdW5kSABSCnBvaW50Rm91",
+            "bmQSMgoLZ2FtZV9maW5pc2gYBCABKAsyDy5kb2YuR2FtZUZpbmlzaEgAUgpn",
+            "YW1lRmluaXNoQggKBmFjdHVhbCJvCgtQbGF5ZXJFbnRlchIXCgdyb29tX2lk",
+            "GAEgASgJUgZyb29tSWQSEAoDdWlkGAIgASgJUgN1aWQSGwoJbmlja19uYW1l",
+            "GAMgASgJUghuaWNrTmFtZRIYCgdjb3VudHJ5GAQgASgJUgdjb3VudHJ5IiUK",
+            "DUxldmVsUmVzb3VyY2USFAoFbGV2ZWwYASABKAlSBWxldmVsIkYKCUdhbWVT",
+            "dGFydBI5Cg5sZXZlbF9yZXNvdXJjZRgBIAMoCzISLmRvZi5MZXZlbFJlc291",
+            "cmNlUg1sZXZlbFJlc291cmNlIjcKDUxldmVsUHJlcGFyZWQSEAoDY2lkGAEg",
+            "ASgDUgNjaWQSFAoFbGV2ZWwYAiABKAlSBWxldmVsIiIKCkxldmVsU3RhcnQS",
+            "FAoFbGV2ZWwYASABKAlSBWxldmVsIk8KClBvaW50Rm91bmQSEAoDY2lkGAEg",
+            "ASgDUgNjaWQSFAoFbGV2ZWwYAiABKAlSBWxldmVsEhkKCHBvaW50X2lkGAMg",
+            "ASgFUgdwb2ludElkIjIKCExldmVsRW5kEhAKA2NpZBgBIAEoA1IDY2lkEhQK",
+            "BWxldmVsGAIgASgJUgVsZXZlbCIfCgtBbGxMZXZlbEVuZBIQCgNjaWQYASAB",
+            "KANSA2NpZCIzCglHYW1lU2NvcmUSEAoDdWlkGAEgASgJUgN1aWQSFAoFc2Nv",
+            "cmUYAiABKAVSBXNjb3JlIjQKCkdhbWVGaW5pc2gSJgoGc2NvcmVzGAEgAygL",
+            "Mg4uZG9mLkdhbWVTY29yZVIGc2NvcmVzIh8KC1BsYXllckxlYXZlEhAKA2Np",
+            "ZBgBIAEoA1IDY2lkQgdaBS4vO3BiYgZwcm90bzM="));
+      descriptor = pbr::FileDescriptor.FromGeneratedCode(descriptorData,
+          new pbr::FileDescriptor[] { },
+          new pbr::GeneratedClrTypeInfo(null, null, new pbr::GeneratedClrTypeInfo[] {
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.ClientInitialize), global::Dof.ClientInitialize.Parser, new[]{ "Cid" }, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.ClientMessage), global::Dof.ClientMessage.Parser, new[]{ "PlayerEnter", "LevelPrepared", "PointFound", "LevelEnd", "AllLevelEnd", "PlayerLeave" }, new[]{ "Actual" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.ServerMessage), global::Dof.ServerMessage.Parser, new[]{ "GameStart", "LevelStart", "PointFound", "GameFinish" }, new[]{ "Actual" }, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.PlayerEnter), global::Dof.PlayerEnter.Parser, new[]{ "RoomId", "Uid", "NickName", "Country" }, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.LevelResource), global::Dof.LevelResource.Parser, new[]{ "Level" }, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.GameStart), global::Dof.GameStart.Parser, new[]{ "LevelResource" }, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.LevelPrepared), global::Dof.LevelPrepared.Parser, new[]{ "Cid", "Level" }, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.LevelStart), global::Dof.LevelStart.Parser, new[]{ "Level" }, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.PointFound), global::Dof.PointFound.Parser, new[]{ "Cid", "Level", "PointId" }, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.LevelEnd), global::Dof.LevelEnd.Parser, new[]{ "Cid", "Level" }, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.AllLevelEnd), global::Dof.AllLevelEnd.Parser, new[]{ "Cid" }, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.GameScore), global::Dof.GameScore.Parser, new[]{ "Uid", "Score" }, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.GameFinish), global::Dof.GameFinish.Parser, new[]{ "Scores" }, null, null, null, null),
+            new pbr::GeneratedClrTypeInfo(typeof(global::Dof.PlayerLeave), global::Dof.PlayerLeave.Parser, new[]{ "Cid" }, null, null, null, null)
+          }));
+    }
+    #endregion
+
+  }
+  #region Messages
+  /// 
+  /// ClientInitialize 服务端接收到 PlayerEnter 消息后发还给客户端的回执
+  /// 
+  public sealed partial class ClientInitialize : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ClientInitialize());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[0]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public ClientInitialize() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public ClientInitialize(ClientInitialize other) : this() {
+      cid_ = other.cid_;
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public ClientInitialize Clone() {
+      return new ClientInitialize(this);
+    }
+
+    /// Field number for the "cid" field.
+    public const int CidFieldNumber = 1;
+    private long cid_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public long Cid {
+      get { return cid_; }
+      set {
+        cid_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as ClientInitialize);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(ClientInitialize other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Cid != other.Cid) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Cid != 0L) hash ^= Cid.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (Cid != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Cid);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(ClientInitialize other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Cid != 0L) {
+        Cid = other.Cid;
+      }
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  /// 
+  /// ClientMessage 客户端发送给服务端的消息类型
+  /// 
+  public sealed partial class ClientMessage : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ClientMessage());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[1]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public ClientMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public ClientMessage(ClientMessage other) : this() {
+      switch (other.ActualCase) {
+        case ActualOneofCase.PlayerEnter:
+          PlayerEnter = other.PlayerEnter.Clone();
+          break;
+        case ActualOneofCase.LevelPrepared:
+          LevelPrepared = other.LevelPrepared.Clone();
+          break;
+        case ActualOneofCase.PointFound:
+          PointFound = other.PointFound.Clone();
+          break;
+        case ActualOneofCase.LevelEnd:
+          LevelEnd = other.LevelEnd.Clone();
+          break;
+        case ActualOneofCase.AllLevelEnd:
+          AllLevelEnd = other.AllLevelEnd.Clone();
+          break;
+        case ActualOneofCase.PlayerLeave:
+          PlayerLeave = other.PlayerLeave.Clone();
+          break;
+      }
+
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public ClientMessage Clone() {
+      return new ClientMessage(this);
+    }
+
+    /// Field number for the "player_enter" field.
+    public const int PlayerEnterFieldNumber = 1;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public global::Dof.PlayerEnter PlayerEnter {
+      get { return actualCase_ == ActualOneofCase.PlayerEnter ? (global::Dof.PlayerEnter) actual_ : null; }
+      set {
+        actual_ = value;
+        actualCase_ = value == null ? ActualOneofCase.None : ActualOneofCase.PlayerEnter;
+      }
+    }
+
+    /// Field number for the "level_prepared" field.
+    public const int LevelPreparedFieldNumber = 2;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public global::Dof.LevelPrepared LevelPrepared {
+      get { return actualCase_ == ActualOneofCase.LevelPrepared ? (global::Dof.LevelPrepared) actual_ : null; }
+      set {
+        actual_ = value;
+        actualCase_ = value == null ? ActualOneofCase.None : ActualOneofCase.LevelPrepared;
+      }
+    }
+
+    /// Field number for the "point_found" field.
+    public const int PointFoundFieldNumber = 3;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public global::Dof.PointFound PointFound {
+      get { return actualCase_ == ActualOneofCase.PointFound ? (global::Dof.PointFound) actual_ : null; }
+      set {
+        actual_ = value;
+        actualCase_ = value == null ? ActualOneofCase.None : ActualOneofCase.PointFound;
+      }
+    }
+
+    /// Field number for the "level_end" field.
+    public const int LevelEndFieldNumber = 4;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public global::Dof.LevelEnd LevelEnd {
+      get { return actualCase_ == ActualOneofCase.LevelEnd ? (global::Dof.LevelEnd) actual_ : null; }
+      set {
+        actual_ = value;
+        actualCase_ = value == null ? ActualOneofCase.None : ActualOneofCase.LevelEnd;
+      }
+    }
+
+    /// Field number for the "all_level_end" field.
+    public const int AllLevelEndFieldNumber = 5;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public global::Dof.AllLevelEnd AllLevelEnd {
+      get { return actualCase_ == ActualOneofCase.AllLevelEnd ? (global::Dof.AllLevelEnd) actual_ : null; }
+      set {
+        actual_ = value;
+        actualCase_ = value == null ? ActualOneofCase.None : ActualOneofCase.AllLevelEnd;
+      }
+    }
+
+    /// Field number for the "player_leave" field.
+    public const int PlayerLeaveFieldNumber = 6;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public global::Dof.PlayerLeave PlayerLeave {
+      get { return actualCase_ == ActualOneofCase.PlayerLeave ? (global::Dof.PlayerLeave) actual_ : null; }
+      set {
+        actual_ = value;
+        actualCase_ = value == null ? ActualOneofCase.None : ActualOneofCase.PlayerLeave;
+      }
+    }
+
+    private object actual_;
+    /// Enum of possible cases for the "actual" oneof.
+    public enum ActualOneofCase {
+      None = 0,
+      PlayerEnter = 1,
+      LevelPrepared = 2,
+      PointFound = 3,
+      LevelEnd = 4,
+      AllLevelEnd = 5,
+      PlayerLeave = 6,
+    }
+    private ActualOneofCase actualCase_ = ActualOneofCase.None;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public ActualOneofCase ActualCase {
+      get { return actualCase_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void ClearActual() {
+      actualCase_ = ActualOneofCase.None;
+      actual_ = null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as ClientMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(ClientMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(PlayerEnter, other.PlayerEnter)) return false;
+      if (!object.Equals(LevelPrepared, other.LevelPrepared)) return false;
+      if (!object.Equals(PointFound, other.PointFound)) return false;
+      if (!object.Equals(LevelEnd, other.LevelEnd)) return false;
+      if (!object.Equals(AllLevelEnd, other.AllLevelEnd)) return false;
+      if (!object.Equals(PlayerLeave, other.PlayerLeave)) return false;
+      if (ActualCase != other.ActualCase) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (actualCase_ == ActualOneofCase.PlayerEnter) hash ^= PlayerEnter.GetHashCode();
+      if (actualCase_ == ActualOneofCase.LevelPrepared) hash ^= LevelPrepared.GetHashCode();
+      if (actualCase_ == ActualOneofCase.PointFound) hash ^= PointFound.GetHashCode();
+      if (actualCase_ == ActualOneofCase.LevelEnd) hash ^= LevelEnd.GetHashCode();
+      if (actualCase_ == ActualOneofCase.AllLevelEnd) hash ^= AllLevelEnd.GetHashCode();
+      if (actualCase_ == ActualOneofCase.PlayerLeave) hash ^= PlayerLeave.GetHashCode();
+      hash ^= (int) actualCase_;
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (actualCase_ == ActualOneofCase.PlayerEnter) {
+        output.WriteRawTag(10);
+        output.WriteMessage(PlayerEnter);
+      }
+      if (actualCase_ == ActualOneofCase.LevelPrepared) {
+        output.WriteRawTag(18);
+        output.WriteMessage(LevelPrepared);
+      }
+      if (actualCase_ == ActualOneofCase.PointFound) {
+        output.WriteRawTag(26);
+        output.WriteMessage(PointFound);
+      }
+      if (actualCase_ == ActualOneofCase.LevelEnd) {
+        output.WriteRawTag(34);
+        output.WriteMessage(LevelEnd);
+      }
+      if (actualCase_ == ActualOneofCase.AllLevelEnd) {
+        output.WriteRawTag(42);
+        output.WriteMessage(AllLevelEnd);
+      }
+      if (actualCase_ == ActualOneofCase.PlayerLeave) {
+        output.WriteRawTag(50);
+        output.WriteMessage(PlayerLeave);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (actualCase_ == ActualOneofCase.PlayerEnter) {
+        output.WriteRawTag(10);
+        output.WriteMessage(PlayerEnter);
+      }
+      if (actualCase_ == ActualOneofCase.LevelPrepared) {
+        output.WriteRawTag(18);
+        output.WriteMessage(LevelPrepared);
+      }
+      if (actualCase_ == ActualOneofCase.PointFound) {
+        output.WriteRawTag(26);
+        output.WriteMessage(PointFound);
+      }
+      if (actualCase_ == ActualOneofCase.LevelEnd) {
+        output.WriteRawTag(34);
+        output.WriteMessage(LevelEnd);
+      }
+      if (actualCase_ == ActualOneofCase.AllLevelEnd) {
+        output.WriteRawTag(42);
+        output.WriteMessage(AllLevelEnd);
+      }
+      if (actualCase_ == ActualOneofCase.PlayerLeave) {
+        output.WriteRawTag(50);
+        output.WriteMessage(PlayerLeave);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (actualCase_ == ActualOneofCase.PlayerEnter) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerEnter);
+      }
+      if (actualCase_ == ActualOneofCase.LevelPrepared) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(LevelPrepared);
+      }
+      if (actualCase_ == ActualOneofCase.PointFound) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PointFound);
+      }
+      if (actualCase_ == ActualOneofCase.LevelEnd) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(LevelEnd);
+      }
+      if (actualCase_ == ActualOneofCase.AllLevelEnd) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(AllLevelEnd);
+      }
+      if (actualCase_ == ActualOneofCase.PlayerLeave) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PlayerLeave);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(ClientMessage other) {
+      if (other == null) {
+        return;
+      }
+      switch (other.ActualCase) {
+        case ActualOneofCase.PlayerEnter:
+          if (PlayerEnter == null) {
+            PlayerEnter = new global::Dof.PlayerEnter();
+          }
+          PlayerEnter.MergeFrom(other.PlayerEnter);
+          break;
+        case ActualOneofCase.LevelPrepared:
+          if (LevelPrepared == null) {
+            LevelPrepared = new global::Dof.LevelPrepared();
+          }
+          LevelPrepared.MergeFrom(other.LevelPrepared);
+          break;
+        case ActualOneofCase.PointFound:
+          if (PointFound == null) {
+            PointFound = new global::Dof.PointFound();
+          }
+          PointFound.MergeFrom(other.PointFound);
+          break;
+        case ActualOneofCase.LevelEnd:
+          if (LevelEnd == null) {
+            LevelEnd = new global::Dof.LevelEnd();
+          }
+          LevelEnd.MergeFrom(other.LevelEnd);
+          break;
+        case ActualOneofCase.AllLevelEnd:
+          if (AllLevelEnd == null) {
+            AllLevelEnd = new global::Dof.AllLevelEnd();
+          }
+          AllLevelEnd.MergeFrom(other.AllLevelEnd);
+          break;
+        case ActualOneofCase.PlayerLeave:
+          if (PlayerLeave == null) {
+            PlayerLeave = new global::Dof.PlayerLeave();
+          }
+          PlayerLeave.MergeFrom(other.PlayerLeave);
+          break;
+      }
+
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 10: {
+            global::Dof.PlayerEnter subBuilder = new global::Dof.PlayerEnter();
+            if (actualCase_ == ActualOneofCase.PlayerEnter) {
+              subBuilder.MergeFrom(PlayerEnter);
+            }
+            input.ReadMessage(subBuilder);
+            PlayerEnter = subBuilder;
+            break;
+          }
+          case 18: {
+            global::Dof.LevelPrepared subBuilder = new global::Dof.LevelPrepared();
+            if (actualCase_ == ActualOneofCase.LevelPrepared) {
+              subBuilder.MergeFrom(LevelPrepared);
+            }
+            input.ReadMessage(subBuilder);
+            LevelPrepared = subBuilder;
+            break;
+          }
+          case 26: {
+            global::Dof.PointFound subBuilder = new global::Dof.PointFound();
+            if (actualCase_ == ActualOneofCase.PointFound) {
+              subBuilder.MergeFrom(PointFound);
+            }
+            input.ReadMessage(subBuilder);
+            PointFound = subBuilder;
+            break;
+          }
+          case 34: {
+            global::Dof.LevelEnd subBuilder = new global::Dof.LevelEnd();
+            if (actualCase_ == ActualOneofCase.LevelEnd) {
+              subBuilder.MergeFrom(LevelEnd);
+            }
+            input.ReadMessage(subBuilder);
+            LevelEnd = subBuilder;
+            break;
+          }
+          case 42: {
+            global::Dof.AllLevelEnd subBuilder = new global::Dof.AllLevelEnd();
+            if (actualCase_ == ActualOneofCase.AllLevelEnd) {
+              subBuilder.MergeFrom(AllLevelEnd);
+            }
+            input.ReadMessage(subBuilder);
+            AllLevelEnd = subBuilder;
+            break;
+          }
+          case 50: {
+            global::Dof.PlayerLeave subBuilder = new global::Dof.PlayerLeave();
+            if (actualCase_ == ActualOneofCase.PlayerLeave) {
+              subBuilder.MergeFrom(PlayerLeave);
+            }
+            input.ReadMessage(subBuilder);
+            PlayerLeave = subBuilder;
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 10: {
+            global::Dof.PlayerEnter subBuilder = new global::Dof.PlayerEnter();
+            if (actualCase_ == ActualOneofCase.PlayerEnter) {
+              subBuilder.MergeFrom(PlayerEnter);
+            }
+            input.ReadMessage(subBuilder);
+            PlayerEnter = subBuilder;
+            break;
+          }
+          case 18: {
+            global::Dof.LevelPrepared subBuilder = new global::Dof.LevelPrepared();
+            if (actualCase_ == ActualOneofCase.LevelPrepared) {
+              subBuilder.MergeFrom(LevelPrepared);
+            }
+            input.ReadMessage(subBuilder);
+            LevelPrepared = subBuilder;
+            break;
+          }
+          case 26: {
+            global::Dof.PointFound subBuilder = new global::Dof.PointFound();
+            if (actualCase_ == ActualOneofCase.PointFound) {
+              subBuilder.MergeFrom(PointFound);
+            }
+            input.ReadMessage(subBuilder);
+            PointFound = subBuilder;
+            break;
+          }
+          case 34: {
+            global::Dof.LevelEnd subBuilder = new global::Dof.LevelEnd();
+            if (actualCase_ == ActualOneofCase.LevelEnd) {
+              subBuilder.MergeFrom(LevelEnd);
+            }
+            input.ReadMessage(subBuilder);
+            LevelEnd = subBuilder;
+            break;
+          }
+          case 42: {
+            global::Dof.AllLevelEnd subBuilder = new global::Dof.AllLevelEnd();
+            if (actualCase_ == ActualOneofCase.AllLevelEnd) {
+              subBuilder.MergeFrom(AllLevelEnd);
+            }
+            input.ReadMessage(subBuilder);
+            AllLevelEnd = subBuilder;
+            break;
+          }
+          case 50: {
+            global::Dof.PlayerLeave subBuilder = new global::Dof.PlayerLeave();
+            if (actualCase_ == ActualOneofCase.PlayerLeave) {
+              subBuilder.MergeFrom(PlayerLeave);
+            }
+            input.ReadMessage(subBuilder);
+            PlayerLeave = subBuilder;
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  /// 
+  /// ServerMessage 服务端发送给客户端的消息类型
+  /// 
+  public sealed partial class ServerMessage : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new ServerMessage());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[2]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public ServerMessage() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public ServerMessage(ServerMessage other) : this() {
+      switch (other.ActualCase) {
+        case ActualOneofCase.GameStart:
+          GameStart = other.GameStart.Clone();
+          break;
+        case ActualOneofCase.LevelStart:
+          LevelStart = other.LevelStart.Clone();
+          break;
+        case ActualOneofCase.PointFound:
+          PointFound = other.PointFound.Clone();
+          break;
+        case ActualOneofCase.GameFinish:
+          GameFinish = other.GameFinish.Clone();
+          break;
+      }
+
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public ServerMessage Clone() {
+      return new ServerMessage(this);
+    }
+
+    /// Field number for the "game_start" field.
+    public const int GameStartFieldNumber = 1;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public global::Dof.GameStart GameStart {
+      get { return actualCase_ == ActualOneofCase.GameStart ? (global::Dof.GameStart) actual_ : null; }
+      set {
+        actual_ = value;
+        actualCase_ = value == null ? ActualOneofCase.None : ActualOneofCase.GameStart;
+      }
+    }
+
+    /// Field number for the "level_start" field.
+    public const int LevelStartFieldNumber = 2;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public global::Dof.LevelStart LevelStart {
+      get { return actualCase_ == ActualOneofCase.LevelStart ? (global::Dof.LevelStart) actual_ : null; }
+      set {
+        actual_ = value;
+        actualCase_ = value == null ? ActualOneofCase.None : ActualOneofCase.LevelStart;
+      }
+    }
+
+    /// Field number for the "point_found" field.
+    public const int PointFoundFieldNumber = 3;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public global::Dof.PointFound PointFound {
+      get { return actualCase_ == ActualOneofCase.PointFound ? (global::Dof.PointFound) actual_ : null; }
+      set {
+        actual_ = value;
+        actualCase_ = value == null ? ActualOneofCase.None : ActualOneofCase.PointFound;
+      }
+    }
+
+    /// Field number for the "game_finish" field.
+    public const int GameFinishFieldNumber = 4;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public global::Dof.GameFinish GameFinish {
+      get { return actualCase_ == ActualOneofCase.GameFinish ? (global::Dof.GameFinish) actual_ : null; }
+      set {
+        actual_ = value;
+        actualCase_ = value == null ? ActualOneofCase.None : ActualOneofCase.GameFinish;
+      }
+    }
+
+    private object actual_;
+    /// Enum of possible cases for the "actual" oneof.
+    public enum ActualOneofCase {
+      None = 0,
+      GameStart = 1,
+      LevelStart = 2,
+      PointFound = 3,
+      GameFinish = 4,
+    }
+    private ActualOneofCase actualCase_ = ActualOneofCase.None;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public ActualOneofCase ActualCase {
+      get { return actualCase_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void ClearActual() {
+      actualCase_ = ActualOneofCase.None;
+      actual_ = null;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as ServerMessage);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(ServerMessage other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (!object.Equals(GameStart, other.GameStart)) return false;
+      if (!object.Equals(LevelStart, other.LevelStart)) return false;
+      if (!object.Equals(PointFound, other.PointFound)) return false;
+      if (!object.Equals(GameFinish, other.GameFinish)) return false;
+      if (ActualCase != other.ActualCase) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (actualCase_ == ActualOneofCase.GameStart) hash ^= GameStart.GetHashCode();
+      if (actualCase_ == ActualOneofCase.LevelStart) hash ^= LevelStart.GetHashCode();
+      if (actualCase_ == ActualOneofCase.PointFound) hash ^= PointFound.GetHashCode();
+      if (actualCase_ == ActualOneofCase.GameFinish) hash ^= GameFinish.GetHashCode();
+      hash ^= (int) actualCase_;
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (actualCase_ == ActualOneofCase.GameStart) {
+        output.WriteRawTag(10);
+        output.WriteMessage(GameStart);
+      }
+      if (actualCase_ == ActualOneofCase.LevelStart) {
+        output.WriteRawTag(18);
+        output.WriteMessage(LevelStart);
+      }
+      if (actualCase_ == ActualOneofCase.PointFound) {
+        output.WriteRawTag(26);
+        output.WriteMessage(PointFound);
+      }
+      if (actualCase_ == ActualOneofCase.GameFinish) {
+        output.WriteRawTag(34);
+        output.WriteMessage(GameFinish);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (actualCase_ == ActualOneofCase.GameStart) {
+        output.WriteRawTag(10);
+        output.WriteMessage(GameStart);
+      }
+      if (actualCase_ == ActualOneofCase.LevelStart) {
+        output.WriteRawTag(18);
+        output.WriteMessage(LevelStart);
+      }
+      if (actualCase_ == ActualOneofCase.PointFound) {
+        output.WriteRawTag(26);
+        output.WriteMessage(PointFound);
+      }
+      if (actualCase_ == ActualOneofCase.GameFinish) {
+        output.WriteRawTag(34);
+        output.WriteMessage(GameFinish);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (actualCase_ == ActualOneofCase.GameStart) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(GameStart);
+      }
+      if (actualCase_ == ActualOneofCase.LevelStart) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(LevelStart);
+      }
+      if (actualCase_ == ActualOneofCase.PointFound) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(PointFound);
+      }
+      if (actualCase_ == ActualOneofCase.GameFinish) {
+        size += 1 + pb::CodedOutputStream.ComputeMessageSize(GameFinish);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(ServerMessage other) {
+      if (other == null) {
+        return;
+      }
+      switch (other.ActualCase) {
+        case ActualOneofCase.GameStart:
+          if (GameStart == null) {
+            GameStart = new global::Dof.GameStart();
+          }
+          GameStart.MergeFrom(other.GameStart);
+          break;
+        case ActualOneofCase.LevelStart:
+          if (LevelStart == null) {
+            LevelStart = new global::Dof.LevelStart();
+          }
+          LevelStart.MergeFrom(other.LevelStart);
+          break;
+        case ActualOneofCase.PointFound:
+          if (PointFound == null) {
+            PointFound = new global::Dof.PointFound();
+          }
+          PointFound.MergeFrom(other.PointFound);
+          break;
+        case ActualOneofCase.GameFinish:
+          if (GameFinish == null) {
+            GameFinish = new global::Dof.GameFinish();
+          }
+          GameFinish.MergeFrom(other.GameFinish);
+          break;
+      }
+
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 10: {
+            global::Dof.GameStart subBuilder = new global::Dof.GameStart();
+            if (actualCase_ == ActualOneofCase.GameStart) {
+              subBuilder.MergeFrom(GameStart);
+            }
+            input.ReadMessage(subBuilder);
+            GameStart = subBuilder;
+            break;
+          }
+          case 18: {
+            global::Dof.LevelStart subBuilder = new global::Dof.LevelStart();
+            if (actualCase_ == ActualOneofCase.LevelStart) {
+              subBuilder.MergeFrom(LevelStart);
+            }
+            input.ReadMessage(subBuilder);
+            LevelStart = subBuilder;
+            break;
+          }
+          case 26: {
+            global::Dof.PointFound subBuilder = new global::Dof.PointFound();
+            if (actualCase_ == ActualOneofCase.PointFound) {
+              subBuilder.MergeFrom(PointFound);
+            }
+            input.ReadMessage(subBuilder);
+            PointFound = subBuilder;
+            break;
+          }
+          case 34: {
+            global::Dof.GameFinish subBuilder = new global::Dof.GameFinish();
+            if (actualCase_ == ActualOneofCase.GameFinish) {
+              subBuilder.MergeFrom(GameFinish);
+            }
+            input.ReadMessage(subBuilder);
+            GameFinish = subBuilder;
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 10: {
+            global::Dof.GameStart subBuilder = new global::Dof.GameStart();
+            if (actualCase_ == ActualOneofCase.GameStart) {
+              subBuilder.MergeFrom(GameStart);
+            }
+            input.ReadMessage(subBuilder);
+            GameStart = subBuilder;
+            break;
+          }
+          case 18: {
+            global::Dof.LevelStart subBuilder = new global::Dof.LevelStart();
+            if (actualCase_ == ActualOneofCase.LevelStart) {
+              subBuilder.MergeFrom(LevelStart);
+            }
+            input.ReadMessage(subBuilder);
+            LevelStart = subBuilder;
+            break;
+          }
+          case 26: {
+            global::Dof.PointFound subBuilder = new global::Dof.PointFound();
+            if (actualCase_ == ActualOneofCase.PointFound) {
+              subBuilder.MergeFrom(PointFound);
+            }
+            input.ReadMessage(subBuilder);
+            PointFound = subBuilder;
+            break;
+          }
+          case 34: {
+            global::Dof.GameFinish subBuilder = new global::Dof.GameFinish();
+            if (actualCase_ == ActualOneofCase.GameFinish) {
+              subBuilder.MergeFrom(GameFinish);
+            }
+            input.ReadMessage(subBuilder);
+            GameFinish = subBuilder;
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  /// 
+  /// PlayerEnter 客户端进入房间
+  /// 
+  public sealed partial class PlayerEnter : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new PlayerEnter());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[3]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public PlayerEnter() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public PlayerEnter(PlayerEnter other) : this() {
+      roomId_ = other.roomId_;
+      uid_ = other.uid_;
+      nickName_ = other.nickName_;
+      country_ = other.country_;
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public PlayerEnter Clone() {
+      return new PlayerEnter(this);
+    }
+
+    /// Field number for the "room_id" field.
+    public const int RoomIdFieldNumber = 1;
+    private string roomId_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public string RoomId {
+      get { return roomId_; }
+      set {
+        roomId_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// Field number for the "uid" field.
+    public const int UidFieldNumber = 2;
+    private string uid_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public string Uid {
+      get { return uid_; }
+      set {
+        uid_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// Field number for the "nick_name" field.
+    public const int NickNameFieldNumber = 3;
+    private string nickName_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public string NickName {
+      get { return nickName_; }
+      set {
+        nickName_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// Field number for the "country" field.
+    public const int CountryFieldNumber = 4;
+    private string country_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public string Country {
+      get { return country_; }
+      set {
+        country_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerEnter);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(PlayerEnter other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (RoomId != other.RoomId) return false;
+      if (Uid != other.Uid) return false;
+      if (NickName != other.NickName) return false;
+      if (Country != other.Country) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (RoomId.Length != 0) hash ^= RoomId.GetHashCode();
+      if (Uid.Length != 0) hash ^= Uid.GetHashCode();
+      if (NickName.Length != 0) hash ^= NickName.GetHashCode();
+      if (Country.Length != 0) hash ^= Country.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (RoomId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(RoomId);
+      }
+      if (Uid.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Uid);
+      }
+      if (NickName.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(NickName);
+      }
+      if (Country.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(Country);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (RoomId.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(RoomId);
+      }
+      if (Uid.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Uid);
+      }
+      if (NickName.Length != 0) {
+        output.WriteRawTag(26);
+        output.WriteString(NickName);
+      }
+      if (Country.Length != 0) {
+        output.WriteRawTag(34);
+        output.WriteString(Country);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (RoomId.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(RoomId);
+      }
+      if (Uid.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Uid);
+      }
+      if (NickName.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(NickName);
+      }
+      if (Country.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Country);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(PlayerEnter other) {
+      if (other == null) {
+        return;
+      }
+      if (other.RoomId.Length != 0) {
+        RoomId = other.RoomId;
+      }
+      if (other.Uid.Length != 0) {
+        Uid = other.Uid;
+      }
+      if (other.NickName.Length != 0) {
+        NickName = other.NickName;
+      }
+      if (other.Country.Length != 0) {
+        Country = other.Country;
+      }
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 10: {
+            RoomId = input.ReadString();
+            break;
+          }
+          case 18: {
+            Uid = input.ReadString();
+            break;
+          }
+          case 26: {
+            NickName = input.ReadString();
+            break;
+          }
+          case 34: {
+            Country = input.ReadString();
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 10: {
+            RoomId = input.ReadString();
+            break;
+          }
+          case 18: {
+            Uid = input.ReadString();
+            break;
+          }
+          case 26: {
+            NickName = input.ReadString();
+            break;
+          }
+          case 34: {
+            Country = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  public sealed partial class LevelResource : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new LevelResource());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[4]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelResource() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelResource(LevelResource other) : this() {
+      level_ = other.level_;
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelResource Clone() {
+      return new LevelResource(this);
+    }
+
+    /// Field number for the "level" field.
+    public const int LevelFieldNumber = 1;
+    private string level_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public string Level {
+      get { return level_; }
+      set {
+        level_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as LevelResource);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(LevelResource other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Level != other.Level) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Level.Length != 0) hash ^= Level.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (Level.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Level);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (Level.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Level);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (Level.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Level);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(LevelResource other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Level.Length != 0) {
+        Level = other.Level;
+      }
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 10: {
+            Level = input.ReadString();
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 10: {
+            Level = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  public sealed partial class GameStart : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new GameStart());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[5]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public GameStart() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public GameStart(GameStart other) : this() {
+      levelResource_ = other.levelResource_.Clone();
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public GameStart Clone() {
+      return new GameStart(this);
+    }
+
+    /// Field number for the "level_resource" field.
+    public const int LevelResourceFieldNumber = 1;
+    private static readonly pb::FieldCodec _repeated_levelResource_codec
+        = pb::FieldCodec.ForMessage(10, global::Dof.LevelResource.Parser);
+    private readonly pbc::RepeatedField levelResource_ = new pbc::RepeatedField();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public pbc::RepeatedField LevelResource {
+      get { return levelResource_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as GameStart);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(GameStart other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!levelResource_.Equals(other.levelResource_)) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= levelResource_.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      levelResource_.WriteTo(output, _repeated_levelResource_codec);
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      levelResource_.WriteTo(ref output, _repeated_levelResource_codec);
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      size += levelResource_.CalculateSize(_repeated_levelResource_codec);
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(GameStart other) {
+      if (other == null) {
+        return;
+      }
+      levelResource_.Add(other.levelResource_);
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 10: {
+            levelResource_.AddEntriesFrom(input, _repeated_levelResource_codec);
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 10: {
+            levelResource_.AddEntriesFrom(ref input, _repeated_levelResource_codec);
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  public sealed partial class LevelPrepared : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new LevelPrepared());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[6]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelPrepared() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelPrepared(LevelPrepared other) : this() {
+      cid_ = other.cid_;
+      level_ = other.level_;
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelPrepared Clone() {
+      return new LevelPrepared(this);
+    }
+
+    /// Field number for the "cid" field.
+    public const int CidFieldNumber = 1;
+    private long cid_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public long Cid {
+      get { return cid_; }
+      set {
+        cid_ = value;
+      }
+    }
+
+    /// Field number for the "level" field.
+    public const int LevelFieldNumber = 2;
+    private string level_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public string Level {
+      get { return level_; }
+      set {
+        level_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as LevelPrepared);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(LevelPrepared other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Cid != other.Cid) return false;
+      if (Level != other.Level) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Cid != 0L) hash ^= Cid.GetHashCode();
+      if (Level.Length != 0) hash ^= Level.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (Level.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Level);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (Level.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Level);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (Cid != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Cid);
+      }
+      if (Level.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Level);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(LevelPrepared other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Cid != 0L) {
+        Cid = other.Cid;
+      }
+      if (other.Level.Length != 0) {
+        Level = other.Level;
+      }
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+          case 18: {
+            Level = input.ReadString();
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+          case 18: {
+            Level = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  public sealed partial class LevelStart : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new LevelStart());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[7]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelStart() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelStart(LevelStart other) : this() {
+      level_ = other.level_;
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelStart Clone() {
+      return new LevelStart(this);
+    }
+
+    /// Field number for the "level" field.
+    public const int LevelFieldNumber = 1;
+    private string level_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public string Level {
+      get { return level_; }
+      set {
+        level_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as LevelStart);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(LevelStart other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Level != other.Level) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Level.Length != 0) hash ^= Level.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (Level.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Level);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (Level.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Level);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (Level.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Level);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(LevelStart other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Level.Length != 0) {
+        Level = other.Level;
+      }
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 10: {
+            Level = input.ReadString();
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 10: {
+            Level = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  public sealed partial class PointFound : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new PointFound());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[8]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public PointFound() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public PointFound(PointFound other) : this() {
+      cid_ = other.cid_;
+      level_ = other.level_;
+      pointId_ = other.pointId_;
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public PointFound Clone() {
+      return new PointFound(this);
+    }
+
+    /// Field number for the "cid" field.
+    public const int CidFieldNumber = 1;
+    private long cid_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public long Cid {
+      get { return cid_; }
+      set {
+        cid_ = value;
+      }
+    }
+
+    /// Field number for the "level" field.
+    public const int LevelFieldNumber = 2;
+    private string level_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public string Level {
+      get { return level_; }
+      set {
+        level_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// Field number for the "point_id" field.
+    public const int PointIdFieldNumber = 3;
+    private int pointId_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int PointId {
+      get { return pointId_; }
+      set {
+        pointId_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as PointFound);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(PointFound other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Cid != other.Cid) return false;
+      if (Level != other.Level) return false;
+      if (PointId != other.PointId) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Cid != 0L) hash ^= Cid.GetHashCode();
+      if (Level.Length != 0) hash ^= Level.GetHashCode();
+      if (PointId != 0) hash ^= PointId.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (Level.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Level);
+      }
+      if (PointId != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(PointId);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (Level.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Level);
+      }
+      if (PointId != 0) {
+        output.WriteRawTag(24);
+        output.WriteInt32(PointId);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (Cid != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Cid);
+      }
+      if (Level.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Level);
+      }
+      if (PointId != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(PointId);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(PointFound other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Cid != 0L) {
+        Cid = other.Cid;
+      }
+      if (other.Level.Length != 0) {
+        Level = other.Level;
+      }
+      if (other.PointId != 0) {
+        PointId = other.PointId;
+      }
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+          case 18: {
+            Level = input.ReadString();
+            break;
+          }
+          case 24: {
+            PointId = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+          case 18: {
+            Level = input.ReadString();
+            break;
+          }
+          case 24: {
+            PointId = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  public sealed partial class LevelEnd : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new LevelEnd());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[9]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelEnd() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelEnd(LevelEnd other) : this() {
+      cid_ = other.cid_;
+      level_ = other.level_;
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public LevelEnd Clone() {
+      return new LevelEnd(this);
+    }
+
+    /// Field number for the "cid" field.
+    public const int CidFieldNumber = 1;
+    private long cid_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public long Cid {
+      get { return cid_; }
+      set {
+        cid_ = value;
+      }
+    }
+
+    /// Field number for the "level" field.
+    public const int LevelFieldNumber = 2;
+    private string level_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public string Level {
+      get { return level_; }
+      set {
+        level_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as LevelEnd);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(LevelEnd other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Cid != other.Cid) return false;
+      if (Level != other.Level) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Cid != 0L) hash ^= Cid.GetHashCode();
+      if (Level.Length != 0) hash ^= Level.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (Level.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Level);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (Level.Length != 0) {
+        output.WriteRawTag(18);
+        output.WriteString(Level);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (Cid != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Cid);
+      }
+      if (Level.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Level);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(LevelEnd other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Cid != 0L) {
+        Cid = other.Cid;
+      }
+      if (other.Level.Length != 0) {
+        Level = other.Level;
+      }
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+          case 18: {
+            Level = input.ReadString();
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+          case 18: {
+            Level = input.ReadString();
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  public sealed partial class AllLevelEnd : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new AllLevelEnd());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[10]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public AllLevelEnd() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public AllLevelEnd(AllLevelEnd other) : this() {
+      cid_ = other.cid_;
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public AllLevelEnd Clone() {
+      return new AllLevelEnd(this);
+    }
+
+    /// Field number for the "cid" field.
+    public const int CidFieldNumber = 1;
+    private long cid_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public long Cid {
+      get { return cid_; }
+      set {
+        cid_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as AllLevelEnd);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(AllLevelEnd other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Cid != other.Cid) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Cid != 0L) hash ^= Cid.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (Cid != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Cid);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(AllLevelEnd other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Cid != 0L) {
+        Cid = other.Cid;
+      }
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  public sealed partial class GameScore : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new GameScore());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[11]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public GameScore() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public GameScore(GameScore other) : this() {
+      uid_ = other.uid_;
+      score_ = other.score_;
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public GameScore Clone() {
+      return new GameScore(this);
+    }
+
+    /// Field number for the "uid" field.
+    public const int UidFieldNumber = 1;
+    private string uid_ = "";
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public string Uid {
+      get { return uid_; }
+      set {
+        uid_ = pb::ProtoPreconditions.CheckNotNull(value, "value");
+      }
+    }
+
+    /// Field number for the "score" field.
+    public const int ScoreFieldNumber = 2;
+    private int score_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int Score {
+      get { return score_; }
+      set {
+        score_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as GameScore);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(GameScore other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Uid != other.Uid) return false;
+      if (Score != other.Score) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Uid.Length != 0) hash ^= Uid.GetHashCode();
+      if (Score != 0) hash ^= Score.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (Uid.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Uid);
+      }
+      if (Score != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Score);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (Uid.Length != 0) {
+        output.WriteRawTag(10);
+        output.WriteString(Uid);
+      }
+      if (Score != 0) {
+        output.WriteRawTag(16);
+        output.WriteInt32(Score);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (Uid.Length != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeStringSize(Uid);
+      }
+      if (Score != 0) {
+        size += 1 + pb::CodedOutputStream.ComputeInt32Size(Score);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(GameScore other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Uid.Length != 0) {
+        Uid = other.Uid;
+      }
+      if (other.Score != 0) {
+        Score = other.Score;
+      }
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 10: {
+            Uid = input.ReadString();
+            break;
+          }
+          case 16: {
+            Score = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 10: {
+            Uid = input.ReadString();
+            break;
+          }
+          case 16: {
+            Score = input.ReadInt32();
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  public sealed partial class GameFinish : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new GameFinish());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[12]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public GameFinish() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public GameFinish(GameFinish other) : this() {
+      scores_ = other.scores_.Clone();
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public GameFinish Clone() {
+      return new GameFinish(this);
+    }
+
+    /// Field number for the "scores" field.
+    public const int ScoresFieldNumber = 1;
+    private static readonly pb::FieldCodec _repeated_scores_codec
+        = pb::FieldCodec.ForMessage(10, global::Dof.GameScore.Parser);
+    private readonly pbc::RepeatedField scores_ = new pbc::RepeatedField();
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public pbc::RepeatedField Scores {
+      get { return scores_; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as GameFinish);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(GameFinish other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if(!scores_.Equals(other.scores_)) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      hash ^= scores_.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      scores_.WriteTo(output, _repeated_scores_codec);
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      scores_.WriteTo(ref output, _repeated_scores_codec);
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      size += scores_.CalculateSize(_repeated_scores_codec);
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(GameFinish other) {
+      if (other == null) {
+        return;
+      }
+      scores_.Add(other.scores_);
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 10: {
+            scores_.AddEntriesFrom(input, _repeated_scores_codec);
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 10: {
+            scores_.AddEntriesFrom(ref input, _repeated_scores_codec);
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  public sealed partial class PlayerLeave : pb::IMessage
+  #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      , pb::IBufferMessage
+  #endif
+  {
+    private static readonly pb::MessageParser _parser = new pb::MessageParser(() => new PlayerLeave());
+    private pb::UnknownFieldSet _unknownFields;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pb::MessageParser Parser { get { return _parser; } }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public static pbr::MessageDescriptor Descriptor {
+      get { return global::Dof.MessagesReflection.Descriptor.MessageTypes[13]; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    pbr::MessageDescriptor pb::IMessage.Descriptor {
+      get { return Descriptor; }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public PlayerLeave() {
+      OnConstruction();
+    }
+
+    partial void OnConstruction();
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public PlayerLeave(PlayerLeave other) : this() {
+      cid_ = other.cid_;
+      _unknownFields = pb::UnknownFieldSet.Clone(other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public PlayerLeave Clone() {
+      return new PlayerLeave(this);
+    }
+
+    /// Field number for the "cid" field.
+    public const int CidFieldNumber = 1;
+    private long cid_;
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public long Cid {
+      get { return cid_; }
+      set {
+        cid_ = value;
+      }
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override bool Equals(object other) {
+      return Equals(other as PlayerLeave);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public bool Equals(PlayerLeave other) {
+      if (ReferenceEquals(other, null)) {
+        return false;
+      }
+      if (ReferenceEquals(other, this)) {
+        return true;
+      }
+      if (Cid != other.Cid) return false;
+      return Equals(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override int GetHashCode() {
+      int hash = 1;
+      if (Cid != 0L) hash ^= Cid.GetHashCode();
+      if (_unknownFields != null) {
+        hash ^= _unknownFields.GetHashCode();
+      }
+      return hash;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public override string ToString() {
+      return pb::JsonFormatter.ToDiagnosticString(this);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void WriteTo(pb::CodedOutputStream output) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      output.WriteRawMessage(this);
+    #else
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(output);
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalWriteTo(ref pb::WriteContext output) {
+      if (Cid != 0L) {
+        output.WriteRawTag(8);
+        output.WriteInt64(Cid);
+      }
+      if (_unknownFields != null) {
+        _unknownFields.WriteTo(ref output);
+      }
+    }
+    #endif
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public int CalculateSize() {
+      int size = 0;
+      if (Cid != 0L) {
+        size += 1 + pb::CodedOutputStream.ComputeInt64Size(Cid);
+      }
+      if (_unknownFields != null) {
+        size += _unknownFields.CalculateSize();
+      }
+      return size;
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(PlayerLeave other) {
+      if (other == null) {
+        return;
+      }
+      if (other.Cid != 0L) {
+        Cid = other.Cid;
+      }
+      _unknownFields = pb::UnknownFieldSet.MergeFrom(_unknownFields, other._unknownFields);
+    }
+
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    public void MergeFrom(pb::CodedInputStream input) {
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+      input.ReadRawMessage(this);
+    #else
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    #endif
+    }
+
+    #if !GOOGLE_PROTOBUF_REFSTRUCT_COMPATIBILITY_MODE
+    [global::System.Diagnostics.DebuggerNonUserCodeAttribute]
+    [global::System.CodeDom.Compiler.GeneratedCode("protoc", null)]
+    void pb::IBufferMessage.InternalMergeFrom(ref pb::ParseContext input) {
+      uint tag;
+      while ((tag = input.ReadTag()) != 0) {
+        switch(tag) {
+          default:
+            _unknownFields = pb::UnknownFieldSet.MergeFieldFrom(_unknownFields, ref input);
+            break;
+          case 8: {
+            Cid = input.ReadInt64();
+            break;
+          }
+        }
+      }
+    }
+    #endif
+
+  }
+
+  #endregion
+
+}
+
+#endregion Designer generated code
diff --git a/dof/go/messages.pb.go b/dof/go/messages.pb.go
index 039fa70..7da844b 100644
--- a/dof/go/messages.pb.go
+++ b/dof/go/messages.pb.go
@@ -215,7 +215,7 @@ type ServerMessage struct {
 	// Types that are assignable to Actual:
 	//
 	//	*ServerMessage_GameStart
-	//	*ServerMessage_LevalStart
+	//	*ServerMessage_LevelStart
 	//	*ServerMessage_PointFound
 	//	*ServerMessage_GameFinish
 	Actual isServerMessage_Actual `protobuf_oneof:"actual"`
@@ -267,9 +267,9 @@ func (x *ServerMessage) GetGameStart() *GameStart {
 	return nil
 }
 
-func (x *ServerMessage) GetLevalStart() *LevalStart {
-	if x, ok := x.GetActual().(*ServerMessage_LevalStart); ok {
-		return x.LevalStart
+func (x *ServerMessage) GetLevelStart() *LevelStart {
+	if x, ok := x.GetActual().(*ServerMessage_LevelStart); ok {
+		return x.LevelStart
 	}
 	return nil
 }
@@ -296,8 +296,8 @@ type ServerMessage_GameStart struct {
 	GameStart *GameStart `protobuf:"bytes,1,opt,name=game_start,json=gameStart,proto3,oneof"`
 }
 
-type ServerMessage_LevalStart struct {
-	LevalStart *LevalStart `protobuf:"bytes,2,opt,name=leval_start,json=levalStart,proto3,oneof"`
+type ServerMessage_LevelStart struct {
+	LevelStart *LevelStart `protobuf:"bytes,2,opt,name=level_start,json=levelStart,proto3,oneof"`
 }
 
 type ServerMessage_PointFound struct {
@@ -310,7 +310,7 @@ type ServerMessage_GameFinish struct {
 
 func (*ServerMessage_GameStart) isServerMessage_Actual() {}
 
-func (*ServerMessage_LevalStart) isServerMessage_Actual() {}
+func (*ServerMessage_LevelStart) isServerMessage_Actual() {}
 
 func (*ServerMessage_PointFound) isServerMessage_Actual() {}
 
@@ -487,7 +487,8 @@ type LevelPrepared struct {
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
 
-	Cid int64 `protobuf:"varint,1,opt,name=cid,proto3" json:"cid,omitempty"`
+	Cid   int64  `protobuf:"varint,1,opt,name=cid,proto3" json:"cid,omitempty"`
+	Level string `protobuf:"bytes,2,opt,name=level,proto3" json:"level,omitempty"`
 }
 
 func (x *LevelPrepared) Reset() {
@@ -529,7 +530,14 @@ func (x *LevelPrepared) GetCid() int64 {
 	return 0
 }
 
-type LevalStart struct {
+func (x *LevelPrepared) GetLevel() string {
+	if x != nil {
+		return x.Level
+	}
+	return ""
+}
+
+type LevelStart struct {
 	state         protoimpl.MessageState
 	sizeCache     protoimpl.SizeCache
 	unknownFields protoimpl.UnknownFields
@@ -537,8 +545,8 @@ type LevalStart struct {
 	Level string `protobuf:"bytes,1,opt,name=level,proto3" json:"level,omitempty"`
 }
 
-func (x *LevalStart) Reset() {
-	*x = LevalStart{}
+func (x *LevelStart) Reset() {
+	*x = LevelStart{}
 	if protoimpl.UnsafeEnabled {
 		mi := &file_dof_messages_proto_msgTypes[7]
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -546,13 +554,13 @@ func (x *LevalStart) Reset() {
 	}
 }
 
-func (x *LevalStart) String() string {
+func (x *LevelStart) String() string {
 	return protoimpl.X.MessageStringOf(x)
 }
 
-func (*LevalStart) ProtoMessage() {}
+func (*LevelStart) ProtoMessage() {}
 
-func (x *LevalStart) ProtoReflect() protoreflect.Message {
+func (x *LevelStart) ProtoReflect() protoreflect.Message {
 	mi := &file_dof_messages_proto_msgTypes[7]
 	if protoimpl.UnsafeEnabled && x != nil {
 		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
@@ -564,12 +572,12 @@ func (x *LevalStart) ProtoReflect() protoreflect.Message {
 	return mi.MessageOf(x)
 }
 
-// Deprecated: Use LevalStart.ProtoReflect.Descriptor instead.
-func (*LevalStart) Descriptor() ([]byte, []int) {
+// Deprecated: Use LevelStart.ProtoReflect.Descriptor instead.
+func (*LevelStart) Descriptor() ([]byte, []int) {
 	return file_dof_messages_proto_rawDescGZIP(), []int{7}
 }
 
-func (x *LevalStart) GetLevel() string {
+func (x *LevelStart) GetLevel() string {
 	if x != nil {
 		return x.Level
 	}
@@ -583,7 +591,7 @@ type PointFound struct {
 
 	Cid     int64  `protobuf:"varint,1,opt,name=cid,proto3" json:"cid,omitempty"`
 	Level   string `protobuf:"bytes,2,opt,name=level,proto3" json:"level,omitempty"`
-	PointId int64  `protobuf:"varint,3,opt,name=point_id,json=pointId,proto3" json:"point_id,omitempty"`
+	PointId int32  `protobuf:"varint,3,opt,name=point_id,json=pointId,proto3" json:"point_id,omitempty"`
 }
 
 func (x *PointFound) Reset() {
@@ -632,7 +640,7 @@ func (x *PointFound) GetLevel() string {
 	return ""
 }
 
-func (x *PointFound) GetPointId() int64 {
+func (x *PointFound) GetPointId() int32 {
 	if x != nil {
 		return x.PointId
 	}
@@ -747,7 +755,7 @@ type GameScore struct {
 	unknownFields protoimpl.UnknownFields
 
 	Uid   string `protobuf:"bytes,1,opt,name=uid,proto3" json:"uid,omitempty"`
-	Score int64  `protobuf:"varint,2,opt,name=score,proto3" json:"score,omitempty"`
+	Score int32  `protobuf:"varint,2,opt,name=score,proto3" json:"score,omitempty"`
 }
 
 func (x *GameScore) Reset() {
@@ -789,7 +797,7 @@ func (x *GameScore) GetUid() string {
 	return ""
 }
 
-func (x *GameScore) GetScore() int64 {
+func (x *GameScore) GetScore() int32 {
 	if x != nil {
 		return x.Score
 	}
@@ -923,10 +931,10 @@ var file_dof_messages_proto_rawDesc = []byte{
 	0x67, 0x65, 0x12, 0x2f, 0x0a, 0x0a, 0x67, 0x61, 0x6d, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74,
 	0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x64, 0x6f, 0x66, 0x2e, 0x47, 0x61, 0x6d,
 	0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x09, 0x67, 0x61, 0x6d, 0x65, 0x53, 0x74,
-	0x61, 0x72, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x6c, 0x65, 0x76, 0x61, 0x6c, 0x5f, 0x73, 0x74, 0x61,
+	0x61, 0x72, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x73, 0x74, 0x61,
 	0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x64, 0x6f, 0x66, 0x2e, 0x4c,
-	0x65, 0x76, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x65, 0x76,
-	0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x70, 0x6f, 0x69, 0x6e, 0x74,
+	0x65, 0x76, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x00, 0x52, 0x0a, 0x6c, 0x65, 0x76,
+	0x65, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x32, 0x0a, 0x0b, 0x70, 0x6f, 0x69, 0x6e, 0x74,
 	0x5f, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x64,
 	0x6f, 0x66, 0x2e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x48, 0x00, 0x52,
 	0x0a, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x32, 0x0a, 0x0b, 0x67,
@@ -947,32 +955,33 @@ var file_dof_messages_proto_rawDesc = []byte{
 	0x0a, 0x0e, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x5f, 0x72, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65,
 	0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x64, 0x6f, 0x66, 0x2e, 0x4c, 0x65, 0x76,
 	0x65, 0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x52, 0x0d, 0x6c, 0x65, 0x76, 0x65,
-	0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x21, 0x0a, 0x0d, 0x4c, 0x65, 0x76,
+	0x6c, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x22, 0x37, 0x0a, 0x0d, 0x4c, 0x65, 0x76,
 	0x65, 0x6c, 0x50, 0x72, 0x65, 0x70, 0x61, 0x72, 0x65, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x69,
-	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x69, 0x64, 0x22, 0x22, 0x0a, 0x0a,
-	0x4c, 0x65, 0x76, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65,
-	0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c,
-	0x22, 0x4f, 0x0a, 0x0a, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x46, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x10,
-	0x0a, 0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x69, 0x64,
-	0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52,
-	0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x08, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f,
-	0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49,
-	0x64, 0x22, 0x32, 0x0a, 0x08, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x45, 0x6e, 0x64, 0x12, 0x10, 0x0a,
-	0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x69, 0x64, 0x12,
-	0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05,
-	0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x1f, 0x0a, 0x0b, 0x41, 0x6c, 0x6c, 0x4c, 0x65, 0x76, 0x65,
-	0x6c, 0x45, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
-	0x03, 0x52, 0x03, 0x63, 0x69, 0x64, 0x22, 0x33, 0x0a, 0x09, 0x47, 0x61, 0x6d, 0x65, 0x53, 0x63,
-	0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09,
-	0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x02,
-	0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x22, 0x34, 0x0a, 0x0a, 0x47,
-	0x61, 0x6d, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x12, 0x26, 0x0a, 0x06, 0x73, 0x63, 0x6f,
-	0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x64, 0x6f, 0x66, 0x2e,
-	0x47, 0x61, 0x6d, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52, 0x06, 0x73, 0x63, 0x6f, 0x72, 0x65,
-	0x73, 0x22, 0x1f, 0x0a, 0x0b, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x4c, 0x65, 0x61, 0x76, 0x65,
-	0x12, 0x10, 0x0a, 0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63,
-	0x69, 0x64, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x2f, 0x3b, 0x70, 0x62, 0x62, 0x06, 0x70, 0x72, 0x6f,
-	0x74, 0x6f, 0x33,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05,
+	0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76,
+	0x65, 0x6c, 0x22, 0x22, 0x0a, 0x0a, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x72, 0x74,
+	0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52,
+	0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x4f, 0x0a, 0x0a, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x46,
+	0x6f, 0x75, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28,
+	0x03, 0x52, 0x03, 0x63, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18,
+	0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x12, 0x19, 0x0a, 0x08,
+	0x70, 0x6f, 0x69, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07,
+	0x70, 0x6f, 0x69, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x32, 0x0a, 0x08, 0x4c, 0x65, 0x76, 0x65, 0x6c,
+	0x45, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03,
+	0x52, 0x03, 0x63, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x02,
+	0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x1f, 0x0a, 0x0b, 0x41,
+	0x6c, 0x6c, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x45, 0x6e, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x69,
+	0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x69, 0x64, 0x22, 0x33, 0x0a, 0x09,
+	0x47, 0x61, 0x6d, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x75, 0x69, 0x64,
+	0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x75, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x73,
+	0x63, 0x6f, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x72,
+	0x65, 0x22, 0x34, 0x0a, 0x0a, 0x47, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x12,
+	0x26, 0x0a, 0x06, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32,
+	0x0e, 0x2e, 0x64, 0x6f, 0x66, 0x2e, 0x47, 0x61, 0x6d, 0x65, 0x53, 0x63, 0x6f, 0x72, 0x65, 0x52,
+	0x06, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x73, 0x22, 0x1f, 0x0a, 0x0b, 0x50, 0x6c, 0x61, 0x79, 0x65,
+	0x72, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x63, 0x69, 0x64, 0x18, 0x01, 0x20,
+	0x01, 0x28, 0x03, 0x52, 0x03, 0x63, 0x69, 0x64, 0x42, 0x07, 0x5a, 0x05, 0x2e, 0x2f, 0x3b, 0x70,
+	0x62, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
 }
 
 var (
@@ -996,7 +1005,7 @@ var file_dof_messages_proto_goTypes = []interface{}{
 	(*LevelResource)(nil),    // 4: dof.LevelResource
 	(*GameStart)(nil),        // 5: dof.GameStart
 	(*LevelPrepared)(nil),    // 6: dof.LevelPrepared
-	(*LevalStart)(nil),       // 7: dof.LevalStart
+	(*LevelStart)(nil),       // 7: dof.LevelStart
 	(*PointFound)(nil),       // 8: dof.PointFound
 	(*LevelEnd)(nil),         // 9: dof.LevelEnd
 	(*AllLevelEnd)(nil),      // 10: dof.AllLevelEnd
@@ -1012,7 +1021,7 @@ var file_dof_messages_proto_depIdxs = []int32{
 	10, // 4: dof.ClientMessage.all_level_end:type_name -> dof.AllLevelEnd
 	13, // 5: dof.ClientMessage.player_leave:type_name -> dof.PlayerLeave
 	5,  // 6: dof.ServerMessage.game_start:type_name -> dof.GameStart
-	7,  // 7: dof.ServerMessage.leval_start:type_name -> dof.LevalStart
+	7,  // 7: dof.ServerMessage.level_start:type_name -> dof.LevelStart
 	8,  // 8: dof.ServerMessage.point_found:type_name -> dof.PointFound
 	12, // 9: dof.ServerMessage.game_finish:type_name -> dof.GameFinish
 	4,  // 10: dof.GameStart.level_resource:type_name -> dof.LevelResource
@@ -1115,7 +1124,7 @@ func file_dof_messages_proto_init() {
 			}
 		}
 		file_dof_messages_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} {
-			switch v := v.(*LevalStart); i {
+			switch v := v.(*LevelStart); i {
 			case 0:
 				return &v.state
 			case 1:
@@ -1209,7 +1218,7 @@ func file_dof_messages_proto_init() {
 	}
 	file_dof_messages_proto_msgTypes[2].OneofWrappers = []interface{}{
 		(*ServerMessage_GameStart)(nil),
-		(*ServerMessage_LevalStart)(nil),
+		(*ServerMessage_LevelStart)(nil),
 		(*ServerMessage_PointFound)(nil),
 		(*ServerMessage_GameFinish)(nil),
 	}
diff --git a/dof/messages.proto b/dof/messages.proto
index b4ad96a..765566a 100644
--- a/dof/messages.proto
+++ b/dof/messages.proto
@@ -23,7 +23,7 @@ message ClientMessage {
 message ServerMessage {
   oneof actual {
     GameStart game_start = 1;
-    LevalStart leval_start = 2;
+    LevelStart level_start = 2;
     PointFound point_found = 3;
     GameFinish game_finish = 4;
   }
@@ -47,16 +47,17 @@ message GameStart {
 
 message LevelPrepared {
   int64 cid = 1;
+  string level = 2;
 }
 
-message LevalStart {
+message LevelStart {
   string level = 1;
 }
 
 message PointFound {
   int64 cid = 1;
   string level = 2;
-  int64 point_id = 3;
+  int32 point_id = 3;
 }
 
 message LevelEnd {
@@ -70,7 +71,7 @@ message AllLevelEnd {
 
 message GameScore {
   string uid = 1;
-  int64 score = 2;
+  int32 score = 2;
 }
 
 message GameFinish {