From f7192b39977d7c72c42d037cecacdfc9df2b653c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 00:32:19 +0100 Subject: [PATCH 01/58] Organise the status response into sub-sections --- cmd/rove-server/internal/routes.go | 38 +- proto/roveapi/roveapi.pb.go | 632 +++++++++++++++++++---------- proto/roveapi/roveapi.proto | 70 ++-- 3 files changed, 481 insertions(+), 259 deletions(-) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 7174c31..86becd7 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -85,23 +85,29 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon } response = &roveapi.StatusResponse{ - Name: rover.Name, - Position: &roveapi.Vector{ - X: int32(rover.Pos.X), - Y: int32(rover.Pos.Y), + Readings: &roveapi.RoverReadings{ + Position: &roveapi.Vector{ + X: int32(rover.Pos.X), + Y: int32(rover.Pos.Y), + }, + Logs: logs, + Wind: s.world.Wind, + }, + Spec: &roveapi.RoverSpecifications{ + Name: rover.Name, + Range: int32(rover.Range), + Capacity: int32(rover.Capacity), + MaximumIntegrity: int32(rover.MaximumIntegrity), + MaximumCharge: int32(rover.MaximumCharge), + }, + Status: &roveapi.RoverStatus{ + Bearing: rover.Bearing, + Inventory: inv, + Integrity: int32(rover.Integrity), + Charge: int32(rover.Charge), + QueuedCommands: queued, + SailPosition: rover.SailPosition, }, - Bearing: rover.Bearing, - Range: int32(rover.Range), - Inventory: inv, - Capacity: int32(rover.Capacity), - Integrity: int32(rover.Integrity), - MaximumIntegrity: int32(rover.MaximumIntegrity), - Charge: int32(rover.Charge), - MaximumCharge: int32(rover.MaximumCharge), - QueuedCommands: queued, - SailPosition: rover.SailPosition, - Logs: logs, - Wind: s.world.Wind, } } return response, nil diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 4fbea99..d5f0a46 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -1061,46 +1061,267 @@ func (x *Vector) GetY() int32 { return 0 } -// StatusResponse is the response given to a status request -type StatusResponse struct { +type RoverSpecifications struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields // The name of the rover Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` - // Position of the rover in world coordinates - Position *Vector `protobuf:"bytes,2,opt,name=position,proto3" json:"position,omitempty"` - // The current direction of the rover - Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` // The range of this rover's radar and broadcasting - Range int32 `protobuf:"varint,4,opt,name=range,proto3" json:"range,omitempty"` - // The items in the rover inventory - Inventory []byte `protobuf:"bytes,5,opt,name=inventory,proto3" json:"inventory,omitempty"` + Range int32 `protobuf:"varint,2,opt,name=range,proto3" json:"range,omitempty"` // The capacity of the inventory - Capacity int32 `protobuf:"varint,6,opt,name=capacity,proto3" json:"capacity,omitempty"` - // The current health of the rover - Integrity int32 `protobuf:"varint,7,opt,name=integrity,proto3" json:"integrity,omitempty"` + Capacity int32 `protobuf:"varint,3,opt,name=capacity,proto3" json:"capacity,omitempty"` // The maximum health of the rover - MaximumIntegrity int32 `protobuf:"varint,8,opt,name=maximumIntegrity,proto3" json:"maximumIntegrity,omitempty"` - // The energy stored in the rover - Charge int32 `protobuf:"varint,9,opt,name=charge,proto3" json:"charge,omitempty"` + MaximumIntegrity int32 `protobuf:"varint,4,opt,name=maximumIntegrity,proto3" json:"maximumIntegrity,omitempty"` // The max energy the rover can store - MaximumCharge int32 `protobuf:"varint,10,opt,name=maximumCharge,proto3" json:"maximumCharge,omitempty"` + MaximumCharge int32 `protobuf:"varint,5,opt,name=maximumCharge,proto3" json:"maximumCharge,omitempty"` +} + +func (x *RoverSpecifications) Reset() { + *x = RoverSpecifications{} + if protoimpl.UnsafeEnabled { + mi := &file_roveapi_roveapi_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoverSpecifications) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoverSpecifications) ProtoMessage() {} + +func (x *RoverSpecifications) ProtoReflect() protoreflect.Message { + mi := &file_roveapi_roveapi_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoverSpecifications.ProtoReflect.Descriptor instead. +func (*RoverSpecifications) Descriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{13} +} + +func (x *RoverSpecifications) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *RoverSpecifications) GetRange() int32 { + if x != nil { + return x.Range + } + return 0 +} + +func (x *RoverSpecifications) GetCapacity() int32 { + if x != nil { + return x.Capacity + } + return 0 +} + +func (x *RoverSpecifications) GetMaximumIntegrity() int32 { + if x != nil { + return x.MaximumIntegrity + } + return 0 +} + +func (x *RoverSpecifications) GetMaximumCharge() int32 { + if x != nil { + return x.MaximumCharge + } + return 0 +} + +type RoverStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The current direction of the rover + Bearing Bearing `protobuf:"varint,1,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` // The current position of the sails - SailPosition SailPosition `protobuf:"varint,11,opt,name=sailPosition,proto3,enum=roveapi.SailPosition" json:"sailPosition,omitempty"` + SailPosition SailPosition `protobuf:"varint,2,opt,name=sailPosition,proto3,enum=roveapi.SailPosition" json:"sailPosition,omitempty"` + // The items in the rover inventory + Inventory []byte `protobuf:"bytes,3,opt,name=inventory,proto3" json:"inventory,omitempty"` + // The current health of the rover + Integrity int32 `protobuf:"varint,4,opt,name=integrity,proto3" json:"integrity,omitempty"` + // The energy stored in the rover + Charge int32 `protobuf:"varint,5,opt,name=charge,proto3" json:"charge,omitempty"` // The set of currently queued commands - QueuedCommands []*Command `protobuf:"bytes,12,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` - // The most recent logs - Logs []*Log `protobuf:"bytes,13,rep,name=logs,proto3" json:"logs,omitempty"` + QueuedCommands []*Command `protobuf:"bytes,6,rep,name=queuedCommands,proto3" json:"queuedCommands,omitempty"` +} + +func (x *RoverStatus) Reset() { + *x = RoverStatus{} + if protoimpl.UnsafeEnabled { + mi := &file_roveapi_roveapi_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoverStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoverStatus) ProtoMessage() {} + +func (x *RoverStatus) ProtoReflect() protoreflect.Message { + mi := &file_roveapi_roveapi_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoverStatus.ProtoReflect.Descriptor instead. +func (*RoverStatus) Descriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{14} +} + +func (x *RoverStatus) GetBearing() Bearing { + if x != nil { + return x.Bearing + } + return Bearing_BearingUnknown +} + +func (x *RoverStatus) GetSailPosition() SailPosition { + if x != nil { + return x.SailPosition + } + return SailPosition_UnknownSailPosition +} + +func (x *RoverStatus) GetInventory() []byte { + if x != nil { + return x.Inventory + } + return nil +} + +func (x *RoverStatus) GetIntegrity() int32 { + if x != nil { + return x.Integrity + } + return 0 +} + +func (x *RoverStatus) GetCharge() int32 { + if x != nil { + return x.Charge + } + return 0 +} + +func (x *RoverStatus) GetQueuedCommands() []*Command { + if x != nil { + return x.QueuedCommands + } + return nil +} + +type RoverReadings struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // Position of the rover in world coordinates + Position *Vector `protobuf:"bytes,1,opt,name=position,proto3" json:"position,omitempty"` // The current wind direction - Wind Bearing `protobuf:"varint,14,opt,name=wind,proto3,enum=roveapi.Bearing" json:"wind,omitempty"` + Wind Bearing `protobuf:"varint,2,opt,name=wind,proto3,enum=roveapi.Bearing" json:"wind,omitempty"` + // The most recent logs + Logs []*Log `protobuf:"bytes,3,rep,name=logs,proto3" json:"logs,omitempty"` +} + +func (x *RoverReadings) Reset() { + *x = RoverReadings{} + if protoimpl.UnsafeEnabled { + mi := &file_roveapi_roveapi_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RoverReadings) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RoverReadings) ProtoMessage() {} + +func (x *RoverReadings) ProtoReflect() protoreflect.Message { + mi := &file_roveapi_roveapi_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RoverReadings.ProtoReflect.Descriptor instead. +func (*RoverReadings) Descriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{15} +} + +func (x *RoverReadings) GetPosition() *Vector { + if x != nil { + return x.Position + } + return nil +} + +func (x *RoverReadings) GetWind() Bearing { + if x != nil { + return x.Wind + } + return Bearing_BearingUnknown +} + +func (x *RoverReadings) GetLogs() []*Log { + if x != nil { + return x.Logs + } + return nil +} + +// StatusResponse is the response given to a status request +type StatusResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The static rover information + Spec *RoverSpecifications `protobuf:"bytes,1,opt,name=spec,proto3" json:"spec,omitempty"` + // Current rover status + Status *RoverStatus `protobuf:"bytes,2,opt,name=status,proto3" json:"status,omitempty"` + // Current rover readings + Readings *RoverReadings `protobuf:"bytes,3,opt,name=readings,proto3" json:"readings,omitempty"` } func (x *StatusResponse) Reset() { *x = StatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_roveapi_roveapi_proto_msgTypes[13] + mi := &file_roveapi_roveapi_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1113,7 +1334,7 @@ func (x *StatusResponse) String() string { func (*StatusResponse) ProtoMessage() {} func (x *StatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_roveapi_roveapi_proto_msgTypes[13] + mi := &file_roveapi_roveapi_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1126,107 +1347,30 @@ func (x *StatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatusResponse.ProtoReflect.Descriptor instead. func (*StatusResponse) Descriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{13} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{16} } -func (x *StatusResponse) GetName() string { +func (x *StatusResponse) GetSpec() *RoverSpecifications { if x != nil { - return x.Name - } - return "" -} - -func (x *StatusResponse) GetPosition() *Vector { - if x != nil { - return x.Position + return x.Spec } return nil } -func (x *StatusResponse) GetBearing() Bearing { +func (x *StatusResponse) GetStatus() *RoverStatus { if x != nil { - return x.Bearing - } - return Bearing_BearingUnknown -} - -func (x *StatusResponse) GetRange() int32 { - if x != nil { - return x.Range - } - return 0 -} - -func (x *StatusResponse) GetInventory() []byte { - if x != nil { - return x.Inventory + return x.Status } return nil } -func (x *StatusResponse) GetCapacity() int32 { +func (x *StatusResponse) GetReadings() *RoverReadings { if x != nil { - return x.Capacity - } - return 0 -} - -func (x *StatusResponse) GetIntegrity() int32 { - if x != nil { - return x.Integrity - } - return 0 -} - -func (x *StatusResponse) GetMaximumIntegrity() int32 { - if x != nil { - return x.MaximumIntegrity - } - return 0 -} - -func (x *StatusResponse) GetCharge() int32 { - if x != nil { - return x.Charge - } - return 0 -} - -func (x *StatusResponse) GetMaximumCharge() int32 { - if x != nil { - return x.MaximumCharge - } - return 0 -} - -func (x *StatusResponse) GetSailPosition() SailPosition { - if x != nil { - return x.SailPosition - } - return SailPosition_UnknownSailPosition -} - -func (x *StatusResponse) GetQueuedCommands() []*Command { - if x != nil { - return x.QueuedCommands + return x.Readings } return nil } -func (x *StatusResponse) GetLogs() []*Log { - if x != nil { - return x.Logs - } - return nil -} - -func (x *StatusResponse) GetWind() Bearing { - if x != nil { - return x.Wind - } - return Bearing_BearingUnknown -} - var File_roveapi_roveapi_proto protoreflect.FileDescriptor var file_roveapi_roveapi_proto_rawDesc = []byte{ @@ -1289,93 +1433,105 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, - 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0x92, 0x04, 0x0a, - 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, - 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x14, 0x0a, 0x05, - 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x1c, 0x0a, 0x09, - 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, - 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x08, + 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, + 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, + 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, - 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x24, - 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, - 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, - 0x73, 0x18, 0x0d, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x12, 0x24, 0x0a, 0x04, 0x77, - 0x69, 0x6e, 0x64, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, 0x6e, - 0x64, 0x2a, 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, - 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, - 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, - 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, - 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, - 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, - 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, - 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, - 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, - 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, - 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, - 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, - 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, - 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, - 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, - 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, - 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, - 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, - 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, - 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, - 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, - 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, - 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, - 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, + 0x0b, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, + 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, + 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, + 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, + 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, + 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, + 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, + 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, + 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, + 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, + 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, + 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, + 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, + 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, + 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, + 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, + 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, + 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, + 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, + 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, + 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, + 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, + 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, + 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, + 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, + 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, + 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, + 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, + 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, + 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, + 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, + 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, + 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, + 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, + 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, + 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1391,7 +1547,7 @@ func file_roveapi_roveapi_proto_rawDescGZIP() []byte { } var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 14) +var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_roveapi_roveapi_proto_goTypes = []interface{}{ (CommandType)(0), // 0: roveapi.CommandType (Bearing)(0), // 1: roveapi.Bearing @@ -1411,7 +1567,10 @@ var file_roveapi_roveapi_proto_goTypes = []interface{}{ (*StatusRequest)(nil), // 15: roveapi.StatusRequest (*Log)(nil), // 16: roveapi.Log (*Vector)(nil), // 17: roveapi.Vector - (*StatusResponse)(nil), // 18: roveapi.StatusResponse + (*RoverSpecifications)(nil), // 18: roveapi.RoverSpecifications + (*RoverStatus)(nil), // 19: roveapi.RoverStatus + (*RoverReadings)(nil), // 20: roveapi.RoverReadings + (*StatusResponse)(nil), // 21: roveapi.StatusResponse } var file_roveapi_roveapi_proto_depIdxs = []int32{ 8, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account @@ -1423,27 +1582,30 @@ var file_roveapi_roveapi_proto_depIdxs = []int32{ 3, // 6: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile 2, // 7: roveapi.RadarResponse.objects:type_name -> roveapi.Object 8, // 8: roveapi.StatusRequest.account:type_name -> roveapi.Account - 17, // 9: roveapi.StatusResponse.position:type_name -> roveapi.Vector - 1, // 10: roveapi.StatusResponse.bearing:type_name -> roveapi.Bearing - 4, // 11: roveapi.StatusResponse.sailPosition:type_name -> roveapi.SailPosition - 10, // 12: roveapi.StatusResponse.queuedCommands:type_name -> roveapi.Command - 16, // 13: roveapi.StatusResponse.logs:type_name -> roveapi.Log - 1, // 14: roveapi.StatusResponse.wind:type_name -> roveapi.Bearing - 5, // 15: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 7, // 16: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 11, // 17: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 13, // 18: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 15, // 19: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 6, // 20: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 9, // 21: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 12, // 22: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 14, // 23: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 18, // 24: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 20, // [20:25] is the sub-list for method output_type - 15, // [15:20] is the sub-list for method input_type - 15, // [15:15] is the sub-list for extension type_name - 15, // [15:15] is the sub-list for extension extendee - 0, // [0:15] is the sub-list for field type_name + 1, // 9: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing + 4, // 10: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition + 10, // 11: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command + 17, // 12: roveapi.RoverReadings.position:type_name -> roveapi.Vector + 1, // 13: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing + 16, // 14: roveapi.RoverReadings.logs:type_name -> roveapi.Log + 18, // 15: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications + 19, // 16: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus + 20, // 17: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings + 5, // 18: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 7, // 19: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 11, // 20: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 13, // 21: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 15, // 22: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 6, // 23: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 9, // 24: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 12, // 25: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 14, // 26: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 21, // 27: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 23, // [23:28] is the sub-list for method output_type + 18, // [18:23] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1609,6 +1771,42 @@ func file_roveapi_roveapi_proto_init() { } } file_roveapi_roveapi_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoverSpecifications); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_roveapi_roveapi_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoverStatus); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_roveapi_roveapi_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RoverReadings); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_roveapi_roveapi_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*StatusResponse); i { case 0: return &v.state @@ -1627,7 +1825,7 @@ func file_roveapi_roveapi_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_roveapi_roveapi_proto_rawDesc, NumEnums: 5, - NumMessages: 14, + NumMessages: 17, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 33bbc25..cc7826a 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -231,47 +231,65 @@ enum SailPosition { SolarCharging = 2; } -// StatusResponse is the response given to a status request -message StatusResponse { +message RoverSpecifications { + // The name of the rover string name = 1; - // Position of the rover in world coordinates - Vector position = 2; - - // The current direction of the rover - Bearing bearing = 3; - // The range of this rover's radar and broadcasting - int32 range = 4; - - // The items in the rover inventory - bytes inventory = 5; + int32 range = 2; // The capacity of the inventory - int32 capacity = 6; - - // The current health of the rover - int32 integrity = 7; + int32 capacity = 3; // The maximum health of the rover - int32 maximumIntegrity = 8; - - // The energy stored in the rover - int32 charge = 9; + int32 maximumIntegrity = 4; // The max energy the rover can store - int32 maximumCharge = 10; + int32 maximumCharge = 5; +} + +message RoverStatus { + + // The current direction of the rover + Bearing bearing = 1; // The current position of the sails - SailPosition sailPosition = 11; + SailPosition sailPosition = 2; + + // The items in the rover inventory + bytes inventory = 3; + + // The current health of the rover + int32 integrity = 4; + + // The energy stored in the rover + int32 charge = 5; // The set of currently queued commands - repeated Command queuedCommands = 12; + repeated Command queuedCommands = 6; +} - // The most recent logs - repeated Log logs = 13; +message RoverReadings { + // Position of the rover in world coordinates + Vector position = 1; // The current wind direction - Bearing wind = 14; + Bearing wind = 2; + + // The most recent logs + repeated Log logs = 3; +} + +// StatusResponse is the response given to a status request +message StatusResponse { + + // The static rover information + RoverSpecifications spec = 1; + + // Current rover status + RoverStatus status = 2; + + // Current rover readings + RoverReadings readings = 3; } \ No newline at end of file From 13e4d6a5e609bac7452bc928107e9155e946f648 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 00:34:57 +0100 Subject: [PATCH 02/58] Remove an old log left in --- pkg/rove/world.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 591ba8e..ea91fbc 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -542,8 +542,6 @@ func (w *World) Tick() { // Reset the move ticks r.MoveTicks = 0 } - - log.Print(ticksToMove) } // Increment the current tick count From 46d904acc6889cf7b1335ce2df371f70d653acd8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 16:41:08 +0100 Subject: [PATCH 03/58] Rename and comment ticksPerNormalMove --- pkg/rove/world.go | 9 +++++---- pkg/rove/world_test.go | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index ea91fbc..a81cf05 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -11,7 +11,8 @@ import ( ) const ( - TicksPerNormalMove = 4 + // ticksPerNormalMove defines the number of ticks it should take for a "normal" speed move + ticksPerNormalMove = 4 ) // CommandStream is a list of commands to execute in order @@ -515,16 +516,16 @@ func (w *World) Tick() { switch diff { case 0: // Going with the wind, travel at base speed of once every 4 ticks - ticksToMove = TicksPerNormalMove + ticksToMove = ticksPerNormalMove case 1: // At a slight angle, we can go a little faster - ticksToMove = TicksPerNormalMove / 2 + ticksToMove = ticksPerNormalMove / 2 case 2: // Perpendicular to wind, max speed ticksToMove = 1 case 3: // Heading at 45 degrees into the wind, back to min speed - ticksToMove = TicksPerNormalMove + ticksToMove = ticksPerNormalMove case 4: // Heading durectly into the wind, no movement at all default: diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index a3c2f47..db9fcb6 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -419,7 +419,7 @@ func TestWorld_Sailing(t *testing.T) { assert.Equal(t, maths.Vector{Y: 0}, info.Pos) // Loop a few more times - for i := 0; i < TicksPerNormalMove-2; i++ { + for i := 0; i < ticksPerNormalMove-2; i++ { world.Tick() info, err := world.GetRover(name) assert.NoError(t, err) @@ -441,7 +441,7 @@ func TestWorld_Sailing(t *testing.T) { assert.Equal(t, roveapi.Bearing_South, b) // Tick a bunch, we should never move - for i := 0; i < TicksPerNormalMove*2; i++ { + for i := 0; i < ticksPerNormalMove*2; i++ { world.Tick() info, err := world.GetRover(name) assert.NoError(t, err) From 8279a08a376edc93e53bcff552aede6a2398ff28 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 16:47:39 +0100 Subject: [PATCH 04/58] Limit the log entries to a max number --- pkg/rove/rover.go | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index fb13ddc..ce0edcd 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -13,6 +13,10 @@ import ( "github.com/mdiluz/rove/proto/roveapi" ) +const ( + maxLogEntries = 16 +) + // RoverLogEntry describes a single log entry for the rover type RoverLogEntry struct { // Time is the timestamp of the entry @@ -89,6 +93,11 @@ func (r *Rover) AddLogEntryf(format string, args ...interface{}) { Text: text, }, ) + + // Limit the number of logs + if len(r.Logs) > maxLogEntries { + r.Logs = r.Logs[len(r.Logs)-maxLogEntries:] + } } var wordsFile = os.Getenv("WORDS_FILE") From 3bfc91b8f6352e9d5a88766119e15f8072d2b47e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 16:56:28 +0100 Subject: [PATCH 05/58] Add command test for stashing --- pkg/rove/command_test.go | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index f55c6cb..0dc2f11 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -48,7 +48,31 @@ func TestCommand_Turn(t *testing.T) { } func TestCommand_Stash(t *testing.T) { - // TODO: Test the stash command + w := NewWorld(8) + name, err := w.SpawnRover() + assert.NoError(t, err) + + info, err := w.GetRover(name) + assert.NoError(t, err) + assert.Empty(t, info.Inventory) + + // Drop a pickup below us + w.Atlas.SetObject(info.Pos, Object{Type: roveapi.Object_RockSmall}) + + // Try and stash it + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_stash}) + assert.NoError(t, err) + w.Tick() + + // Check we now have it in the inventory + info, err = w.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, 1, len(info.Inventory)) + assert.Equal(t, Object{Type: roveapi.Object_RockSmall}, info.Inventory[0]) + + // Check it's no longer on the atlas + _, obj := w.Atlas.QueryPosition(info.Pos) + assert.Equal(t, Object{Type: roveapi.Object_ObjectUnknown}, obj) } func TestCommand_Repair(t *testing.T) { From 8a8a27ab47713ec568190a62eaa379f7bb3857e6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 18:37:54 +0100 Subject: [PATCH 06/58] Add a test for the repair command --- pkg/rove/command_test.go | 39 ++++++++++++++++++++++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 0dc2f11..ec9c1b5 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -3,6 +3,7 @@ package rove import ( "testing" + "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" "github.com/stretchr/testify/assert" ) @@ -76,7 +77,43 @@ func TestCommand_Stash(t *testing.T) { } func TestCommand_Repair(t *testing.T) { - // TODO: Test the repair command + w := NewWorld(8) + name, err := w.SpawnRover() + assert.NoError(t, err) + + info, err := w.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, info.MaximumIntegrity, info.Integrity) + + // Put a blocking rock to the north + w.Atlas.SetObject(info.Pos.Added(maths.Vector{X: 0, Y: 1}), Object{Type: roveapi.Object_RockLarge}) + + // Try and move and make sure we're blocked + newpos, err := w.TryMoveRover(name, roveapi.Bearing_North) + assert.NoError(t, err) + assert.Equal(t, info.Pos, newpos) + + // Check we're damaged + info, err = w.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, info.MaximumIntegrity-1, info.Integrity) + + // Stash a repair object + w.Atlas.SetObject(info.Pos, Object{Type: roveapi.Object_RockSmall}) + obj, err := w.RoverStash(name) + assert.NoError(t, err) + assert.Equal(t, roveapi.Object_RockSmall, obj) + + // Enqueue the repair and tick + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_repair}) + assert.NoError(t, err) + w.Tick() + + // Check we're repaired + info, err = w.GetRover(name) + assert.NoError(t, err) + assert.Equal(t, info.MaximumIntegrity, info.Integrity) + assert.Equal(t, 0, len(info.Inventory)) } func TestCommand_Broadcast(t *testing.T) { From 8cc3b9155ec66ff1087b74fd46e86923b24426ab Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 18:40:32 +0100 Subject: [PATCH 07/58] Implement broadcast command test --- pkg/rove/command_test.go | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index ec9c1b5..b0f2336 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -117,7 +117,18 @@ func TestCommand_Repair(t *testing.T) { } func TestCommand_Broadcast(t *testing.T) { - // TODO: Test the stash command + w := NewWorld(8) + name, err := w.SpawnRover() + assert.NoError(t, err) + + // Enqueue the broadcast and tick + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_broadcast, Broadcast: []byte("ABC")}) + assert.NoError(t, err) + w.Tick() + + info, err := w.GetRover(name) + assert.NoError(t, err) + assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "ABC") } func TestCommand_Invalid(t *testing.T) { From 41cd93e9866287a421f02a740e557e62170f4378 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 18:41:12 +0100 Subject: [PATCH 08/58] Add command test for no command as error --- pkg/rove/command_test.go | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index b0f2336..d73b25c 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -132,5 +132,10 @@ func TestCommand_Broadcast(t *testing.T) { } func TestCommand_Invalid(t *testing.T) { - // TODO: Test an invalid command + w := NewWorld(8) + name, err := w.SpawnRover() + assert.NoError(t, err) + + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_none}) + assert.Error(t, err) } From 2c1bb8077931bc75b678d0b08aa25240d3b6e1a5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Thu, 23 Jul 2020 19:01:16 +0100 Subject: [PATCH 09/58] Add salvage command Slight refactor to re-use command variables Also fixes the cmdline client turn command --- cmd/rove/main.go | 8 +- pkg/rove/command_test.go | 4 +- pkg/rove/world.go | 12 +- proto/roveapi/roveapi.pb.go | 481 +++++++++++++++++++++--------------- proto/roveapi/roveapi.proto | 26 +- 5 files changed, 306 insertions(+), 225 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 01e16ae..97a7a24 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -243,8 +243,8 @@ func InnerMain(command string, args ...string) error { } commands = append(commands, &roveapi.Command{ - Command: roveapi.CommandType_broadcast, - Broadcast: []byte(args[i]), + Command: roveapi.CommandType_turn, + Bearing: b, }, ) case "broadcast": @@ -256,8 +256,8 @@ func InnerMain(command string, args ...string) error { } commands = append(commands, &roveapi.Command{ - Command: roveapi.CommandType_broadcast, - Broadcast: []byte(args[i]), + Command: roveapi.CommandType_broadcast, + Data: []byte(args[i]), }, ) default: diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index d73b25c..8f4dd36 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -39,7 +39,7 @@ func TestCommand_Turn(t *testing.T) { a, err := w.SpawnRover() assert.NoError(t, err) - err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Turn: roveapi.Bearing_NorthWest}) + err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Bearing: roveapi.Bearing_NorthWest}) assert.NoError(t, err) w.Tick() @@ -122,7 +122,7 @@ func TestCommand_Broadcast(t *testing.T) { assert.NoError(t, err) // Enqueue the broadcast and tick - err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_broadcast, Broadcast: []byte("ABC")}) + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_broadcast, Data: []byte("ABC")}) assert.NoError(t, err) w.Tick() diff --git a/pkg/rove/world.go b/pkg/rove/world.go index a81cf05..50348dc 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -435,16 +435,16 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { for _, c := range commands { switch c.Command { case roveapi.CommandType_broadcast: - if len(c.GetBroadcast()) > 3 { - return fmt.Errorf("too many characters in message (limit 3): %d", len(c.GetBroadcast())) + if len(c.GetData()) > 3 { + return fmt.Errorf("too many characters in message (limit 3): %d", len(c.GetData())) } - for _, b := range c.GetBroadcast() { + for _, b := range c.GetData() { if b < 37 || b > 126 { return fmt.Errorf("invalid message character: %c", b) } } case roveapi.CommandType_turn: - if c.GetTurn() == roveapi.Bearing_BearingUnknown { + if c.GetBearing() == roveapi.Bearing_BearingUnknown { return fmt.Errorf("turn command given unknown bearing") } case roveapi.CommandType_toggle: @@ -569,12 +569,12 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (err error) { } case roveapi.CommandType_broadcast: - if err := w.RoverBroadcast(rover, c.GetBroadcast()); err != nil { + if err := w.RoverBroadcast(rover, c.GetData()); err != nil { return err } case roveapi.CommandType_turn: - if _, err := w.RoverTurn(rover, c.GetTurn()); err != nil { + if _, err := w.RoverTurn(rover, c.GetBearing()); err != nil { return err } diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index d5f0a46..c5e458c 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -41,14 +41,16 @@ const ( CommandType_none CommandType = 0 // Toggles the sails, either catching the wind, or charging from the sun CommandType_toggle CommandType = 1 - // Turns the rover in the specified bearing, requires data + // Turns the rover in the specified bearing (requires bearing) CommandType_turn CommandType = 2 // Stashes item at current location in rover inventory CommandType_stash CommandType = 3 // Repairs the rover using an inventory object CommandType_repair CommandType = 4 - // Broadcasts a message to nearby rovers, requires data + // Broadcasts a message to nearby rovers (requires data) CommandType_broadcast CommandType = 5 + // Salvages a neighboring dormant rover for parts (requres bearing and salvage) + CommandType_salvage CommandType = 6 ) // Enum value maps for CommandType. @@ -60,6 +62,7 @@ var ( 3: "stash", 4: "repair", 5: "broadcast", + 6: "salvage", } CommandType_value = map[string]int32{ "none": 0, @@ -68,6 +71,7 @@ var ( "stash": 3, "repair": 4, "broadcast": 5, + "salvage": 6, } ) @@ -167,6 +171,53 @@ func (Bearing) EnumDescriptor() ([]byte, []int) { return file_roveapi_roveapi_proto_rawDescGZIP(), []int{1} } +type SalvageType int32 + +const ( + SalvageType_SalvageUnknown SalvageType = 0 + // Salvage a nearby rover for parts + SalvageType_SalvageParts SalvageType = 1 +) + +// Enum value maps for SalvageType. +var ( + SalvageType_name = map[int32]string{ + 0: "SalvageUnknown", + 1: "SalvageParts", + } + SalvageType_value = map[string]int32{ + "SalvageUnknown": 0, + "SalvageParts": 1, + } +) + +func (x SalvageType) Enum() *SalvageType { + p := new(SalvageType) + *p = x + return p +} + +func (x SalvageType) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (SalvageType) Descriptor() protoreflect.EnumDescriptor { + return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() +} + +func (SalvageType) Type() protoreflect.EnumType { + return &file_roveapi_roveapi_proto_enumTypes[2] +} + +func (x SalvageType) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use SalvageType.Descriptor instead. +func (SalvageType) EnumDescriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} +} + // Types of objects type Object int32 @@ -212,11 +263,11 @@ func (x Object) String() string { } func (Object) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() } func (Object) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[2] + return &file_roveapi_roveapi_proto_enumTypes[3] } func (x Object) Number() protoreflect.EnumNumber { @@ -225,7 +276,7 @@ func (x Object) Number() protoreflect.EnumNumber { // Deprecated: Use Object.Descriptor instead. func (Object) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} } type Tile int32 @@ -268,11 +319,11 @@ func (x Tile) String() string { } func (Tile) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() } func (Tile) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[3] + return &file_roveapi_roveapi_proto_enumTypes[4] } func (x Tile) Number() protoreflect.EnumNumber { @@ -281,7 +332,7 @@ func (x Tile) Number() protoreflect.EnumNumber { // Deprecated: Use Tile.Descriptor instead. func (Tile) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} } // SailPosition represents the position of the sola sail @@ -320,11 +371,11 @@ func (x SailPosition) String() string { } func (SailPosition) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[5].Descriptor() } func (SailPosition) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[4] + return &file_roveapi_roveapi_proto_enumTypes[5] } func (x SailPosition) Number() protoreflect.EnumNumber { @@ -333,7 +384,7 @@ func (x SailPosition) Number() protoreflect.EnumNumber { // Deprecated: Use SailPosition.Descriptor instead. func (SailPosition) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{5} } // ServerStatusRequest is an empty placeholder @@ -624,11 +675,13 @@ type Command struct { // The command type Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=roveapi.CommandType" json:"command,omitempty"` - // A simple message, must be composed of printable ASCII glyphs (32-126) - // maximum of three characters - Broadcast []byte `protobuf:"bytes,2,opt,name=broadcast,proto3" json:"broadcast,omitempty"` - // The bearing for the rover to turn to - Turn Bearing `protobuf:"varint,3,opt,name=turn,proto3,enum=roveapi.Bearing" json:"turn,omitempty"` + // broadcast - a simple message, must be composed of up to 3 printable ASCII glyphs (32-126) + Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // move - the bearing for the rover to turn to + // salvage - the direction of the rover + Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` + // salvage - the type of salvage to execute + Salvage SalvageType `protobuf:"varint,4,opt,name=salvage,proto3,enum=roveapi.SalvageType" json:"salvage,omitempty"` } func (x *Command) Reset() { @@ -670,20 +723,27 @@ func (x *Command) GetCommand() CommandType { return CommandType_none } -func (x *Command) GetBroadcast() []byte { +func (x *Command) GetData() []byte { if x != nil { - return x.Broadcast + return x.Data } return nil } -func (x *Command) GetTurn() Bearing { +func (x *Command) GetBearing() Bearing { if x != nil { - return x.Turn + return x.Bearing } return Bearing_BearingUnknown } +func (x *Command) GetSalvage() SalvageType { + if x != nil { + return x.Salvage + } + return SalvageType_SalvageUnknown +} + // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState @@ -1397,141 +1457,148 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x7d, 0x0a, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, - 0x73, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, - 0x6e, 0x67, 0x52, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa9, 0x01, 0x0a, 0x07, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x61, + 0x6c, 0x76, 0x61, 0x67, 0x65, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, - 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, - 0x29, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, - 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, - 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, - 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, - 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, - 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, - 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, - 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, - 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, - 0x0b, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, - 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, - 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, - 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, - 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, - 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, - 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, - 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, - 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, - 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, - 0x53, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, - 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, - 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, - 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, - 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, - 0x73, 0x74, 0x10, 0x05, 0x2a, 0x83, 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, - 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, - 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, - 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, - 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, - 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, - 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, - 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x08, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, - 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, - 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, - 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, - 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, - 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, - 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, - 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, - 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, - 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, - 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, - 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, - 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, - 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, - 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, - 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, - 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, + 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, + 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, + 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, + 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, + 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, + 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, + 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, + 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, + 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, + 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, + 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, + 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, + 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x60, 0x0a, 0x0b, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, + 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, + 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, + 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, + 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x2a, 0x83, + 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, + 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, + 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, + 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, + 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, + 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, + 0x73, 0x74, 0x10, 0x08, 0x2a, 0x33, 0x0a, 0x0b, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x55, 0x6e, + 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x61, 0x6c, 0x76, 0x61, + 0x67, 0x65, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x01, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, + 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, + 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, + 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, + 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, + 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, + 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, + 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, + 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, + 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, + 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, + 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, + 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, + 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, + 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, + 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, + 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1546,66 +1613,68 @@ func file_roveapi_roveapi_proto_rawDescGZIP() []byte { return file_roveapi_roveapi_proto_rawDescData } -var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 6) var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_roveapi_roveapi_proto_goTypes = []interface{}{ (CommandType)(0), // 0: roveapi.CommandType (Bearing)(0), // 1: roveapi.Bearing - (Object)(0), // 2: roveapi.Object - (Tile)(0), // 3: roveapi.Tile - (SailPosition)(0), // 4: roveapi.SailPosition - (*ServerStatusRequest)(nil), // 5: roveapi.ServerStatusRequest - (*ServerStatusResponse)(nil), // 6: roveapi.ServerStatusResponse - (*RegisterRequest)(nil), // 7: roveapi.RegisterRequest - (*Account)(nil), // 8: roveapi.Account - (*RegisterResponse)(nil), // 9: roveapi.RegisterResponse - (*Command)(nil), // 10: roveapi.Command - (*CommandRequest)(nil), // 11: roveapi.CommandRequest - (*CommandResponse)(nil), // 12: roveapi.CommandResponse - (*RadarRequest)(nil), // 13: roveapi.RadarRequest - (*RadarResponse)(nil), // 14: roveapi.RadarResponse - (*StatusRequest)(nil), // 15: roveapi.StatusRequest - (*Log)(nil), // 16: roveapi.Log - (*Vector)(nil), // 17: roveapi.Vector - (*RoverSpecifications)(nil), // 18: roveapi.RoverSpecifications - (*RoverStatus)(nil), // 19: roveapi.RoverStatus - (*RoverReadings)(nil), // 20: roveapi.RoverReadings - (*StatusResponse)(nil), // 21: roveapi.StatusResponse + (SalvageType)(0), // 2: roveapi.SalvageType + (Object)(0), // 3: roveapi.Object + (Tile)(0), // 4: roveapi.Tile + (SailPosition)(0), // 5: roveapi.SailPosition + (*ServerStatusRequest)(nil), // 6: roveapi.ServerStatusRequest + (*ServerStatusResponse)(nil), // 7: roveapi.ServerStatusResponse + (*RegisterRequest)(nil), // 8: roveapi.RegisterRequest + (*Account)(nil), // 9: roveapi.Account + (*RegisterResponse)(nil), // 10: roveapi.RegisterResponse + (*Command)(nil), // 11: roveapi.Command + (*CommandRequest)(nil), // 12: roveapi.CommandRequest + (*CommandResponse)(nil), // 13: roveapi.CommandResponse + (*RadarRequest)(nil), // 14: roveapi.RadarRequest + (*RadarResponse)(nil), // 15: roveapi.RadarResponse + (*StatusRequest)(nil), // 16: roveapi.StatusRequest + (*Log)(nil), // 17: roveapi.Log + (*Vector)(nil), // 18: roveapi.Vector + (*RoverSpecifications)(nil), // 19: roveapi.RoverSpecifications + (*RoverStatus)(nil), // 20: roveapi.RoverStatus + (*RoverReadings)(nil), // 21: roveapi.RoverReadings + (*StatusResponse)(nil), // 22: roveapi.StatusResponse } var file_roveapi_roveapi_proto_depIdxs = []int32{ - 8, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account + 9, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account 0, // 1: roveapi.Command.command:type_name -> roveapi.CommandType - 1, // 2: roveapi.Command.turn:type_name -> roveapi.Bearing - 8, // 3: roveapi.CommandRequest.account:type_name -> roveapi.Account - 10, // 4: roveapi.CommandRequest.commands:type_name -> roveapi.Command - 8, // 5: roveapi.RadarRequest.account:type_name -> roveapi.Account - 3, // 6: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile - 2, // 7: roveapi.RadarResponse.objects:type_name -> roveapi.Object - 8, // 8: roveapi.StatusRequest.account:type_name -> roveapi.Account - 1, // 9: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing - 4, // 10: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition - 10, // 11: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command - 17, // 12: roveapi.RoverReadings.position:type_name -> roveapi.Vector - 1, // 13: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing - 16, // 14: roveapi.RoverReadings.logs:type_name -> roveapi.Log - 18, // 15: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications - 19, // 16: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus - 20, // 17: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings - 5, // 18: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 7, // 19: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 11, // 20: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 13, // 21: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 15, // 22: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 6, // 23: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 9, // 24: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 12, // 25: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 14, // 26: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 21, // 27: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 23, // [23:28] is the sub-list for method output_type - 18, // [18:23] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + 1, // 2: roveapi.Command.bearing:type_name -> roveapi.Bearing + 2, // 3: roveapi.Command.salvage:type_name -> roveapi.SalvageType + 9, // 4: roveapi.CommandRequest.account:type_name -> roveapi.Account + 11, // 5: roveapi.CommandRequest.commands:type_name -> roveapi.Command + 9, // 6: roveapi.RadarRequest.account:type_name -> roveapi.Account + 4, // 7: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile + 3, // 8: roveapi.RadarResponse.objects:type_name -> roveapi.Object + 9, // 9: roveapi.StatusRequest.account:type_name -> roveapi.Account + 1, // 10: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing + 5, // 11: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition + 11, // 12: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command + 18, // 13: roveapi.RoverReadings.position:type_name -> roveapi.Vector + 1, // 14: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing + 17, // 15: roveapi.RoverReadings.logs:type_name -> roveapi.Log + 19, // 16: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications + 20, // 17: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus + 21, // 18: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings + 6, // 19: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 8, // 20: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 12, // 21: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 14, // 22: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 16, // 23: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 7, // 24: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 10, // 25: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 13, // 26: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 15, // 27: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 22, // 28: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 24, // [24:29] is the sub-list for method output_type + 19, // [19:24] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1824,7 +1893,7 @@ func file_roveapi_roveapi_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_roveapi_roveapi_proto_rawDesc, - NumEnums: 5, + NumEnums: 6, NumMessages: 17, NumExtensions: 0, NumServices: 1, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index cc7826a..2d8917e 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -91,14 +91,16 @@ enum CommandType { none = 0; // Toggles the sails, either catching the wind, or charging from the sun toggle = 1; - // Turns the rover in the specified bearing, requires data + // Turns the rover in the specified bearing (requires bearing) turn = 2; // Stashes item at current location in rover inventory stash = 3; // Repairs the rover using an inventory object repair = 4; - // Broadcasts a message to nearby rovers, requires data + // Broadcasts a message to nearby rovers (requires data) broadcast = 5; + // Salvages a neighboring dormant rover for parts (requres bearing and salvage) + salvage = 6; } // Bearing represents a compass direction @@ -115,17 +117,27 @@ enum Bearing { NorthWest = 8; } +enum SalvageType { + SalvageUnknown = 0; + + // Salvage a nearby rover for parts + SalvageParts = 1; +} + // Command is a single command for a rover message Command { // The command type CommandType command = 1; - // A simple message, must be composed of printable ASCII glyphs (32-126) - // maximum of three characters - bytes broadcast = 2; + // broadcast - a simple message, must be composed of up to 3 printable ASCII glyphs (32-126) + bytes data = 2; - // The bearing for the rover to turn to - Bearing turn = 3; + // move - the bearing for the rover to turn to + // salvage - the direction of the rover + Bearing bearing = 3; + + // salvage - the type of salvage to execute + SalvageType salvage = 4; } // CommandRequest describes a set of commands to be requested for the rover From ce6e10afbb0deb73601b07ff5640a23453d7abe0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:08:03 +0100 Subject: [PATCH 10/58] Add salvage command to main.go man page --- cmd/rove/main.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 97a7a24..aaca561 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -37,6 +37,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") fmt.Fprintln(os.Stderr, "\trepair uses an inventory object to repair the rover") fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") + fmt.Fprintln(os.Stderr, "\tsalvage uses an inventory object to repair the rover") fmt.Fprintln(os.Stderr, "\nEnvironment") fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) } From 2f1ccdfdb91fa2676e417e376b127afae0946a18 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:08:39 +0100 Subject: [PATCH 11/58] Make repair require rover parts --- pkg/rove/command_test.go | 4 +- pkg/rove/objects.go | 1 + pkg/rove/world.go | 23 +- pkg/rove/world_test.go | 8 +- proto/roveapi/roveapi.pb.go | 461 ++++++++++++++++-------------------- proto/roveapi/roveapi.proto | 15 +- 6 files changed, 230 insertions(+), 282 deletions(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 8f4dd36..9ca2748 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -99,10 +99,10 @@ func TestCommand_Repair(t *testing.T) { assert.Equal(t, info.MaximumIntegrity-1, info.Integrity) // Stash a repair object - w.Atlas.SetObject(info.Pos, Object{Type: roveapi.Object_RockSmall}) + w.Atlas.SetObject(info.Pos, Object{Type: roveapi.Object_RoverParts}) obj, err := w.RoverStash(name) assert.NoError(t, err) - assert.Equal(t, roveapi.Object_RockSmall, obj) + assert.Equal(t, roveapi.Object_RoverParts, obj) // Enqueue the repair and tick err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_repair}) diff --git a/pkg/rove/objects.go b/pkg/rove/objects.go index f1ce227..d5fd237 100644 --- a/pkg/rove/objects.go +++ b/pkg/rove/objects.go @@ -33,6 +33,7 @@ func (o *Object) IsBlocking() bool { func (o *Object) IsStashable() bool { var stashable = [...]roveapi.Object{ roveapi.Object_RockSmall, + roveapi.Object_RoverParts, } for _, t := range stashable { diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 50348dc..de0bcae 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -352,11 +352,24 @@ func (w *World) RoverRepair(rover string) (int, error) { return 0, fmt.Errorf("no rover matching id") } - // Consume an inventory item to repair if possible - if len(r.Inventory) > 0 && r.Integrity < r.MaximumIntegrity { - r.Inventory = r.Inventory[:len(r.Inventory)-1] - r.Integrity = r.Integrity + 1 - r.AddLogEntryf("repaired self to %d", r.Integrity) + // Can't repair past max + if r.Integrity >= r.MaximumIntegrity { + return r.Integrity, nil + } + + // Find rover parts in inventory + for i, o := range r.Inventory { + if o.Type == roveapi.Object_RoverParts { + + // Copy-erase from slice + r.Inventory[i] = r.Inventory[len(r.Inventory)-1] + r.Inventory = r.Inventory[:len(r.Inventory)-1] + + // Repair + r.Integrity = r.Integrity + 1 + r.AddLogEntryf("repaired self to %d", r.Integrity) + break + } } return r.Integrity, nil diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index db9fcb6..53be582 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -248,10 +248,10 @@ func TestWorld_RoverRepair(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") // Pick up something to repair with - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RoverParts}) o, err := world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") + assert.Equal(t, roveapi.Object_RoverParts, o, "Failed to get correct object") world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, Object{Type: roveapi.Object_RockLarge}) @@ -273,10 +273,10 @@ func TestWorld_RoverRepair(t *testing.T) { assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "repair", "Rover logs should contain the repair") // Check again that it can't repair past the max - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RoverParts}) o, err = world.RoverStash(a) assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") + assert.Equal(t, roveapi.Object_RoverParts, o, "Failed to get correct object") err = world.ExecuteCommand(&roveapi.Command{Command: roveapi.CommandType_repair}, a) assert.NoError(t, err, "Failed to repair rover") diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index c5e458c..e86ab46 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -49,7 +49,7 @@ const ( CommandType_repair CommandType = 4 // Broadcasts a message to nearby rovers (requires data) CommandType_broadcast CommandType = 5 - // Salvages a neighboring dormant rover for parts (requres bearing and salvage) + // Salvages a neighboring dormant rover for parts CommandType_salvage CommandType = 6 ) @@ -171,53 +171,6 @@ func (Bearing) EnumDescriptor() ([]byte, []int) { return file_roveapi_roveapi_proto_rawDescGZIP(), []int{1} } -type SalvageType int32 - -const ( - SalvageType_SalvageUnknown SalvageType = 0 - // Salvage a nearby rover for parts - SalvageType_SalvageParts SalvageType = 1 -) - -// Enum value maps for SalvageType. -var ( - SalvageType_name = map[int32]string{ - 0: "SalvageUnknown", - 1: "SalvageParts", - } - SalvageType_value = map[string]int32{ - "SalvageUnknown": 0, - "SalvageParts": 1, - } -) - -func (x SalvageType) Enum() *SalvageType { - p := new(SalvageType) - *p = x - return p -} - -func (x SalvageType) String() string { - return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) -} - -func (SalvageType) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() -} - -func (SalvageType) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[2] -} - -func (x SalvageType) Number() protoreflect.EnumNumber { - return protoreflect.EnumNumber(x) -} - -// Deprecated: Use SalvageType.Descriptor instead. -func (SalvageType) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} -} - // Types of objects type Object int32 @@ -232,6 +185,8 @@ const ( Object_RockSmall Object = 3 // RockLarge is a large blocking rock Object_RockLarge Object = 4 + // RoverParts is one unit of rover parts, used for repairing and fixing the rover + Object_RoverParts Object = 5 ) // Enum value maps for Object. @@ -242,6 +197,7 @@ var ( 2: "RoverDormant", 3: "RockSmall", 4: "RockLarge", + 5: "RoverParts", } Object_value = map[string]int32{ "ObjectUnknown": 0, @@ -249,6 +205,7 @@ var ( "RoverDormant": 2, "RockSmall": 3, "RockLarge": 4, + "RoverParts": 5, } ) @@ -263,11 +220,11 @@ func (x Object) String() string { } func (Object) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() } func (Object) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[3] + return &file_roveapi_roveapi_proto_enumTypes[2] } func (x Object) Number() protoreflect.EnumNumber { @@ -276,7 +233,7 @@ func (x Object) Number() protoreflect.EnumNumber { // Deprecated: Use Object.Descriptor instead. func (Object) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} } type Tile int32 @@ -319,11 +276,11 @@ func (x Tile) String() string { } func (Tile) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() } func (Tile) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[4] + return &file_roveapi_roveapi_proto_enumTypes[3] } func (x Tile) Number() protoreflect.EnumNumber { @@ -332,7 +289,7 @@ func (x Tile) Number() protoreflect.EnumNumber { // Deprecated: Use Tile.Descriptor instead. func (Tile) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} } // SailPosition represents the position of the sola sail @@ -371,11 +328,11 @@ func (x SailPosition) String() string { } func (SailPosition) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[5].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() } func (SailPosition) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[5] + return &file_roveapi_roveapi_proto_enumTypes[4] } func (x SailPosition) Number() protoreflect.EnumNumber { @@ -384,7 +341,7 @@ func (x SailPosition) Number() protoreflect.EnumNumber { // Deprecated: Use SailPosition.Descriptor instead. func (SailPosition) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{5} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} } // ServerStatusRequest is an empty placeholder @@ -680,8 +637,6 @@ type Command struct { // move - the bearing for the rover to turn to // salvage - the direction of the rover Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` - // salvage - the type of salvage to execute - Salvage SalvageType `protobuf:"varint,4,opt,name=salvage,proto3,enum=roveapi.SalvageType" json:"salvage,omitempty"` } func (x *Command) Reset() { @@ -737,13 +692,6 @@ func (x *Command) GetBearing() Bearing { return Bearing_BearingUnknown } -func (x *Command) GetSalvage() SalvageType { - if x != nil { - return x.Salvage - } - return SalvageType_SalvageUnknown -} - // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState @@ -1457,148 +1405,143 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xa9, 0x01, 0x0a, 0x07, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2e, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x73, 0x61, - 0x6c, 0x76, 0x61, 0x67, 0x65, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x07, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, + 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, + 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, + 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, + 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, - 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, - 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, - 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, - 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, - 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, - 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, - 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, - 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, - 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, - 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, - 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, - 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, - 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, - 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, - 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, - 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, - 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x60, 0x0a, 0x0b, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, - 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, - 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, - 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, - 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x2a, 0x83, - 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, - 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, - 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, - 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, - 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, - 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, - 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, - 0x73, 0x74, 0x10, 0x08, 0x2a, 0x33, 0x0a, 0x0b, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x12, 0x0a, 0x0e, 0x53, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x55, 0x6e, - 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x61, 0x6c, 0x76, 0x61, - 0x67, 0x65, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x01, 0x2a, 0x5a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, - 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, - 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, - 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, - 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, - 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, - 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, - 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, - 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, - 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, - 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, - 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, - 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, - 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, - 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, - 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, - 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, - 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, + 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, + 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, + 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, + 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, + 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, + 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, + 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, + 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, 0x01, + 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, + 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, + 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x04, + 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, + 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, + 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, + 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x60, 0x0a, 0x0b, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, + 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, + 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, + 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, + 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, + 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x2a, 0x83, 0x01, + 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, + 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, + 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, + 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, + 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, + 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, + 0x74, 0x10, 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, + 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, + 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, + 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, + 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, + 0x0e, 0x0a, 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, 0x2a, + 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, + 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, + 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, + 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, + 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, + 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, + 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, + 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, + 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, + 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, + 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, + 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1613,68 +1556,66 @@ func file_roveapi_roveapi_proto_rawDescGZIP() []byte { return file_roveapi_roveapi_proto_rawDescData } -var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 6) +var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 5) var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_roveapi_roveapi_proto_goTypes = []interface{}{ (CommandType)(0), // 0: roveapi.CommandType (Bearing)(0), // 1: roveapi.Bearing - (SalvageType)(0), // 2: roveapi.SalvageType - (Object)(0), // 3: roveapi.Object - (Tile)(0), // 4: roveapi.Tile - (SailPosition)(0), // 5: roveapi.SailPosition - (*ServerStatusRequest)(nil), // 6: roveapi.ServerStatusRequest - (*ServerStatusResponse)(nil), // 7: roveapi.ServerStatusResponse - (*RegisterRequest)(nil), // 8: roveapi.RegisterRequest - (*Account)(nil), // 9: roveapi.Account - (*RegisterResponse)(nil), // 10: roveapi.RegisterResponse - (*Command)(nil), // 11: roveapi.Command - (*CommandRequest)(nil), // 12: roveapi.CommandRequest - (*CommandResponse)(nil), // 13: roveapi.CommandResponse - (*RadarRequest)(nil), // 14: roveapi.RadarRequest - (*RadarResponse)(nil), // 15: roveapi.RadarResponse - (*StatusRequest)(nil), // 16: roveapi.StatusRequest - (*Log)(nil), // 17: roveapi.Log - (*Vector)(nil), // 18: roveapi.Vector - (*RoverSpecifications)(nil), // 19: roveapi.RoverSpecifications - (*RoverStatus)(nil), // 20: roveapi.RoverStatus - (*RoverReadings)(nil), // 21: roveapi.RoverReadings - (*StatusResponse)(nil), // 22: roveapi.StatusResponse + (Object)(0), // 2: roveapi.Object + (Tile)(0), // 3: roveapi.Tile + (SailPosition)(0), // 4: roveapi.SailPosition + (*ServerStatusRequest)(nil), // 5: roveapi.ServerStatusRequest + (*ServerStatusResponse)(nil), // 6: roveapi.ServerStatusResponse + (*RegisterRequest)(nil), // 7: roveapi.RegisterRequest + (*Account)(nil), // 8: roveapi.Account + (*RegisterResponse)(nil), // 9: roveapi.RegisterResponse + (*Command)(nil), // 10: roveapi.Command + (*CommandRequest)(nil), // 11: roveapi.CommandRequest + (*CommandResponse)(nil), // 12: roveapi.CommandResponse + (*RadarRequest)(nil), // 13: roveapi.RadarRequest + (*RadarResponse)(nil), // 14: roveapi.RadarResponse + (*StatusRequest)(nil), // 15: roveapi.StatusRequest + (*Log)(nil), // 16: roveapi.Log + (*Vector)(nil), // 17: roveapi.Vector + (*RoverSpecifications)(nil), // 18: roveapi.RoverSpecifications + (*RoverStatus)(nil), // 19: roveapi.RoverStatus + (*RoverReadings)(nil), // 20: roveapi.RoverReadings + (*StatusResponse)(nil), // 21: roveapi.StatusResponse } var file_roveapi_roveapi_proto_depIdxs = []int32{ - 9, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account + 8, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account 0, // 1: roveapi.Command.command:type_name -> roveapi.CommandType 1, // 2: roveapi.Command.bearing:type_name -> roveapi.Bearing - 2, // 3: roveapi.Command.salvage:type_name -> roveapi.SalvageType - 9, // 4: roveapi.CommandRequest.account:type_name -> roveapi.Account - 11, // 5: roveapi.CommandRequest.commands:type_name -> roveapi.Command - 9, // 6: roveapi.RadarRequest.account:type_name -> roveapi.Account - 4, // 7: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile - 3, // 8: roveapi.RadarResponse.objects:type_name -> roveapi.Object - 9, // 9: roveapi.StatusRequest.account:type_name -> roveapi.Account - 1, // 10: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing - 5, // 11: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition - 11, // 12: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command - 18, // 13: roveapi.RoverReadings.position:type_name -> roveapi.Vector - 1, // 14: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing - 17, // 15: roveapi.RoverReadings.logs:type_name -> roveapi.Log - 19, // 16: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications - 20, // 17: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus - 21, // 18: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings - 6, // 19: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 8, // 20: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 12, // 21: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 14, // 22: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 16, // 23: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 7, // 24: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 10, // 25: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 13, // 26: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 15, // 27: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 22, // 28: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 24, // [24:29] is the sub-list for method output_type - 19, // [19:24] is the sub-list for method input_type - 19, // [19:19] is the sub-list for extension type_name - 19, // [19:19] is the sub-list for extension extendee - 0, // [0:19] is the sub-list for field type_name + 8, // 3: roveapi.CommandRequest.account:type_name -> roveapi.Account + 10, // 4: roveapi.CommandRequest.commands:type_name -> roveapi.Command + 8, // 5: roveapi.RadarRequest.account:type_name -> roveapi.Account + 3, // 6: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile + 2, // 7: roveapi.RadarResponse.objects:type_name -> roveapi.Object + 8, // 8: roveapi.StatusRequest.account:type_name -> roveapi.Account + 1, // 9: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing + 4, // 10: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition + 10, // 11: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command + 17, // 12: roveapi.RoverReadings.position:type_name -> roveapi.Vector + 1, // 13: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing + 16, // 14: roveapi.RoverReadings.logs:type_name -> roveapi.Log + 18, // 15: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications + 19, // 16: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus + 20, // 17: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings + 5, // 18: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 7, // 19: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 11, // 20: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 13, // 21: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 15, // 22: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 6, // 23: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 9, // 24: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 12, // 25: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 14, // 26: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 21, // 27: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 23, // [23:28] is the sub-list for method output_type + 18, // [18:23] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1893,7 +1834,7 @@ func file_roveapi_roveapi_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_roveapi_roveapi_proto_rawDesc, - NumEnums: 6, + NumEnums: 5, NumMessages: 17, NumExtensions: 0, NumServices: 1, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 2d8917e..6b9515c 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -99,7 +99,7 @@ enum CommandType { repair = 4; // Broadcasts a message to nearby rovers (requires data) broadcast = 5; - // Salvages a neighboring dormant rover for parts (requres bearing and salvage) + // Salvages a neighboring dormant rover for parts salvage = 6; } @@ -117,13 +117,6 @@ enum Bearing { NorthWest = 8; } -enum SalvageType { - SalvageUnknown = 0; - - // Salvage a nearby rover for parts - SalvageParts = 1; -} - // Command is a single command for a rover message Command { // The command type @@ -135,9 +128,6 @@ message Command { // move - the bearing for the rover to turn to // salvage - the direction of the rover Bearing bearing = 3; - - // salvage - the type of salvage to execute - SalvageType salvage = 4; } // CommandRequest describes a set of commands to be requested for the rover @@ -172,6 +162,9 @@ enum Object { // RockLarge is a large blocking rock RockLarge = 4; + + // RoverParts is one unit of rover parts, used for repairing and fixing the rover + RoverParts = 5; } enum Tile { From 524487ce149ddffb4ec39fb95950acf764e8f84c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:27:54 +0100 Subject: [PATCH 12/58] Stop the dormant rover from being a blocking object --- pkg/rove/objects.go | 1 - 1 file changed, 1 deletion(-) diff --git a/pkg/rove/objects.go b/pkg/rove/objects.go index d5fd237..df10453 100644 --- a/pkg/rove/objects.go +++ b/pkg/rove/objects.go @@ -17,7 +17,6 @@ type Object struct { func (o *Object) IsBlocking() bool { var blocking = [...]roveapi.Object{ roveapi.Object_RoverLive, - roveapi.Object_RoverDormant, roveapi.Object_RockLarge, } From 7cccb4394f7eb0583ba603d34e1097e002149156 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:28:44 +0100 Subject: [PATCH 13/58] Fix the help text comment --- cmd/rove/main.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index aaca561..b3a7ed6 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -37,7 +37,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") fmt.Fprintln(os.Stderr, "\trepair uses an inventory object to repair the rover") fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") - fmt.Fprintln(os.Stderr, "\tsalvage uses an inventory object to repair the rover") + fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") fmt.Fprintln(os.Stderr, "\nEnvironment") fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) } From c321f88d962fcdba8de9a9e8950f6c31f8f702b5 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:39:14 +0100 Subject: [PATCH 14/58] Add code for salvage command --- pkg/rove/command_test.go | 28 ++++++++++++++++++++++++ pkg/rove/world.go | 46 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 9ca2748..9a8a35a 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -131,6 +131,34 @@ func TestCommand_Broadcast(t *testing.T) { assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "ABC") } +func TestCommand_Salvage(t *testing.T) { + w := NewWorld(8) + name, err := w.SpawnRover() + assert.NoError(t, err) + + info, err := w.GetRover(name) + assert.NoError(t, err) + + w.Atlas.SetObject(info.Pos, Object{Type: roveapi.Object_RoverDormant}) + + // Enqueue the broadcast and tick + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_salvage}) + assert.NoError(t, err) + w.Tick() + + // Check we now have some rover parts + info, err = w.GetRover(name) + assert.NoError(t, err) + assert.NotEmpty(t, info.Inventory) + for _, i := range info.Inventory { + assert.Equal(t, roveapi.Object_RoverParts, i.Type) + } + + // Check the dormant rover is gone + _, obj := w.Atlas.QueryPosition(info.Pos) + assert.Equal(t, roveapi.Object_ObjectUnknown, obj.Type) +} + func TestCommand_Invalid(t *testing.T) { w := NewWorld(8) name, err := w.SpawnRover() diff --git a/pkg/rove/world.go b/pkg/rove/world.go index de0bcae..b18f23e 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -300,6 +300,46 @@ func (w *World) RoverStash(rover string) (roveapi.Object, error) { return obj.Type, nil } +// RoverSalvage will salvage a rover for parts +func (w *World) RoverSalvage(rover string) (roveapi.Object, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + r, ok := w.Rovers[rover] + if !ok { + return roveapi.Object_ObjectUnknown, fmt.Errorf("no rover matching id") + } + + // Can't pick up when full + if len(r.Inventory) >= r.Capacity { + r.AddLogEntryf("tried to salvage dormant rover but inventory was full") + return roveapi.Object_ObjectUnknown, nil + } + + // Ensure the rover has energy + if r.Charge <= 0 { + r.AddLogEntryf("tried to salvage dormant rover but had no charge") + return roveapi.Object_ObjectUnknown, nil + } + r.Charge-- + + _, obj := w.Atlas.QueryPosition(r.Pos) + if obj.Type != roveapi.Object_RoverDormant { + r.AddLogEntryf("tried to salvage dormant rover but found no rover to salvage") + return roveapi.Object_ObjectUnknown, nil + } + + r.AddLogEntryf("salvaged dormant rover") + for i := 0; i < 5; i++ { + if len(r.Inventory) == r.Capacity { + break + } + r.Inventory = append(r.Inventory, Object{Type: roveapi.Object_RoverParts}) + } + w.Atlas.SetObject(r.Pos, Object{Type: roveapi.Object_ObjectUnknown}) + return obj.Type, nil +} + // RoverToggle will toggle the sail position func (w *World) RoverToggle(rover string) (roveapi.SailPosition, error) { w.worldMutex.Lock() @@ -463,6 +503,7 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { case roveapi.CommandType_toggle: case roveapi.CommandType_stash: case roveapi.CommandType_repair: + case roveapi.CommandType_salvage: // Nothing to verify default: return fmt.Errorf("unknown command: %s", c.Command) @@ -591,6 +632,11 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (err error) { return err } + case roveapi.CommandType_salvage: + if _, err := w.RoverSalvage(rover); err != nil { + return err + } + default: return fmt.Errorf("unknown command: %s", c.Command) } From be36f0631b830f849ef0148e21ef38576e196da8 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:39:25 +0100 Subject: [PATCH 15/58] Add logs for failed stashes --- pkg/rove/world.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index b18f23e..a500287 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -280,11 +280,13 @@ func (w *World) RoverStash(rover string) (roveapi.Object, error) { // Can't pick up when full if len(r.Inventory) >= r.Capacity { + r.AddLogEntryf("tried to stash object but inventory was full") return roveapi.Object_ObjectUnknown, nil } // Ensure the rover has energy if r.Charge <= 0 { + r.AddLogEntryf("tried to stash object but had no charge") return roveapi.Object_ObjectUnknown, nil } r.Charge-- From b0ff3eb6ea58201a657a493be7dd36c4a00a4182 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:39:33 +0100 Subject: [PATCH 16/58] Remove redundant tests (covered in command_tests) --- pkg/rove/world_test.go | 130 ----------------------------------------- 1 file changed, 130 deletions(-) diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 53be582..430d571 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -128,79 +128,6 @@ func TestWorld_RadarFromRover(t *testing.T) { assert.Equal(t, objs1, objs2) } -func TestWorld_RoverStash(t *testing.T) { - world := NewWorld(2) - a, err := world.SpawnRover() - assert.NoError(t, err) - - pos := maths.Vector{ - X: 0.0, - Y: 0.0, - } - - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_ObjectUnknown}) - err = world.WarpRover(a, pos) - assert.NoError(t, err, "Failed to set position for rover") - - rover, err := world.GetRover(a) - assert.NoError(t, err, "Failed to get rover") - - for i := 0; i < rover.Capacity; i++ { - // Place an object - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) - - // Pick it up - o, err := world.RoverStash(a) - assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_RockSmall, o, "Failed to get correct object") - - // Check it's gone - _, obj := world.Atlas.QueryPosition(pos) - assert.Equal(t, roveapi.Object_ObjectUnknown, obj.Type, "Stash failed to remove object from atlas") - - // Check we have it - inv, err := world.RoverInventory(a) - assert.NoError(t, err, "Failed to get inventory") - assert.Equal(t, i+1, len(inv)) - assert.Equal(t, Object{Type: roveapi.Object_RockSmall}, inv[i]) - - // Check that this did reduce the charge - info, err := world.GetRover(a) - assert.NoError(t, err, "Failed to get rover") - assert.Equal(t, info.MaximumCharge-(i+1), info.Charge, "Rover lost charge for stash") - assert.Contains(t, info.Logs[len(info.Logs)-1].Text, "stashed", "Rover logs should contain the move") - } - - // Recharge the rover - for i := 0; i < rover.MaximumCharge; i++ { - _, err = world.RoverRecharge(a) - assert.NoError(t, err) - - } - - // Place an object - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RockSmall}) - - // Try to pick it up - o, err := world.RoverStash(a) - assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_ObjectUnknown, o, "Failed to get correct object") - - // Check it's still there - _, obj := world.Atlas.QueryPosition(pos) - assert.Equal(t, roveapi.Object_RockSmall, obj.Type, "Stash failed to remove object from atlas") - - // Check we don't have it - inv, err := world.RoverInventory(a) - assert.NoError(t, err, "Failed to get inventory") - assert.Equal(t, rover.Capacity, len(inv)) - - // Check that this didn't reduce the charge - info, err := world.GetRover(a) - assert.NoError(t, err, "Failed to get rover") - assert.Equal(t, info.MaximumCharge, info.Charge, "Rover lost charge for non-stash") -} - func TestWorld_RoverDamage(t *testing.T) { world := NewWorld(2) a, err := world.SpawnRover() @@ -229,63 +156,6 @@ func TestWorld_RoverDamage(t *testing.T) { assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "collision", "Rover logs should contain the collision") } -func TestWorld_RoverRepair(t *testing.T) { - world := NewWorld(2) - a, err := world.SpawnRover() - assert.NoError(t, err) - - pos := maths.Vector{ - X: 0.0, - Y: 0.0, - } - - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_ObjectUnknown}) - - err = world.WarpRover(a, pos) - assert.NoError(t, err, "Failed to set position for rover") - - originalInfo, err := world.GetRover(a) - assert.NoError(t, err, "couldn't get rover info") - - // Pick up something to repair with - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RoverParts}) - o, err := world.RoverStash(a) - assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_RoverParts, o, "Failed to get correct object") - - world.Atlas.SetObject(maths.Vector{X: 0.0, Y: 1.0}, Object{Type: roveapi.Object_RockLarge}) - - // Try and bump into the rock - vec, err := world.TryMoveRover(a, roveapi.Bearing_North) - assert.NoError(t, err, "Failed to move rover") - assert.Equal(t, pos, vec, "Rover managed to move into large rock") - - newinfo, err := world.GetRover(a) - assert.NoError(t, err, "couldn't get rover info") - assert.Equal(t, originalInfo.Integrity-1, newinfo.Integrity, "rover should have lost integrity") - - err = world.ExecuteCommand(&roveapi.Command{Command: roveapi.CommandType_repair}, a) - assert.NoError(t, err, "Failed to repair rover") - - newinfo, err = world.GetRover(a) - assert.NoError(t, err, "couldn't get rover info") - assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have gained integrity") - assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "repair", "Rover logs should contain the repair") - - // Check again that it can't repair past the max - world.Atlas.SetObject(pos, Object{Type: roveapi.Object_RoverParts}) - o, err = world.RoverStash(a) - assert.NoError(t, err, "Failed to stash") - assert.Equal(t, roveapi.Object_RoverParts, o, "Failed to get correct object") - - err = world.ExecuteCommand(&roveapi.Command{Command: roveapi.CommandType_repair}, a) - assert.NoError(t, err, "Failed to repair rover") - - newinfo, err = world.GetRover(a) - assert.NoError(t, err, "couldn't get rover info") - assert.Equal(t, originalInfo.Integrity, newinfo.Integrity, "rover should have kept the same integrity") -} - func TestWorld_Daytime(t *testing.T) { world := NewWorld(1) From edd3e5a6cbc3855ecd089c950e964ab3c70fce41 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:42:34 +0100 Subject: [PATCH 17/58] Fix test by removing object before warping rover --- pkg/rove/world_test.go | 1 + 1 file changed, 1 insertion(+) diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 430d571..e1fa700 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -138,6 +138,7 @@ func TestWorld_RoverDamage(t *testing.T) { Y: 0.0, } + world.Atlas.SetObject(pos, Object{Type: roveapi.Object_ObjectUnknown}) err = world.WarpRover(a, pos) assert.NoError(t, err, "Failed to set position for rover") From 5b2ea533f41081564724025b7fe7c8891d1e5819 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 19:46:32 +0100 Subject: [PATCH 18/58] Remove incorrect proto comment --- proto/roveapi/roveapi.proto | 1 - 1 file changed, 1 deletion(-) diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 6b9515c..7acedac 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -126,7 +126,6 @@ message Command { bytes data = 2; // move - the bearing for the rover to turn to - // salvage - the direction of the rover Bearing bearing = 3; } From 1e4d642038660ceda198bc769c22d688efe5b7a1 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 20:01:35 +0100 Subject: [PATCH 19/58] Add rover transfer command and implementation Need to swap the accounts --- pkg/rove/world.go | 54 +++++++++++++++++++ proto/roveapi/roveapi.pb.go | 104 +++++++++++++++++++----------------- proto/roveapi/roveapi.proto | 2 + 3 files changed, 110 insertions(+), 50 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index a500287..afe7605 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -1,6 +1,7 @@ package rove import ( + "encoding/json" "fmt" "log" "math/rand" @@ -342,6 +343,53 @@ func (w *World) RoverSalvage(rover string) (roveapi.Object, error) { return obj.Type, nil } +// RoverTransfer will transfer rover control to dormant rover +func (w *World) RoverTransfer(rover string) (string, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + oldRover, ok := w.Rovers[rover] + if !ok { + return "", fmt.Errorf("no rover matching id") + } + + _, obj := w.Atlas.QueryPosition(oldRover.Pos) + if obj.Type != roveapi.Object_RoverDormant { + oldRover.AddLogEntryf("tried to transfer to dormant rover but found no rover") + return "", nil + } + + // Unmarshal the dormant rover + var newRover Rover + err := json.Unmarshal(obj.Data, &newRover) + if err != nil { + return "", err + } + + // Add logs + oldRover.AddLogEntryf("transferring to dormant rover %s", newRover.Name) + newRover.AddLogEntryf("transferred from rover %s", oldRover.Name) + + // Marshal old rover + oldRoverData, err := json.Marshal(oldRover) + if err != nil { + return "", err + } + + // Add this new rover to tracking + w.Rovers[newRover.Name] = &newRover + + // TODO: Swap account rover to the dormant one + + // Place the old rover into the world + w.Atlas.SetObject(oldRover.Pos, Object{Type: roveapi.Object_RoverDormant, Data: oldRoverData}) + + // Remove old rover from current tracking + delete(w.Rovers, oldRover.Name) + + return newRover.Name, nil +} + // RoverToggle will toggle the sail position func (w *World) RoverToggle(rover string) (roveapi.SailPosition, error) { w.worldMutex.Lock() @@ -506,6 +554,7 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { case roveapi.CommandType_stash: case roveapi.CommandType_repair: case roveapi.CommandType_salvage: + case roveapi.CommandType_transfer: // Nothing to verify default: return fmt.Errorf("unknown command: %s", c.Command) @@ -639,6 +688,11 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (err error) { return err } + case roveapi.CommandType_transfer: + if _, err := w.RoverTransfer(rover); err != nil { + return err + } + default: return fmt.Errorf("unknown command: %s", c.Command) } diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index e86ab46..cc6fe07 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -51,6 +51,8 @@ const ( CommandType_broadcast CommandType = 5 // Salvages a neighboring dormant rover for parts CommandType_salvage CommandType = 6 + // Transfers remote control into dormant rover + CommandType_transfer CommandType = 7 ) // Enum value maps for CommandType. @@ -63,6 +65,7 @@ var ( 4: "repair", 5: "broadcast", 6: "salvage", + 7: "transfer", } CommandType_value = map[string]int32{ "none": 0, @@ -72,6 +75,7 @@ var ( "repair": 4, "broadcast": 5, "salvage": 6, + "transfer": 7, } ) @@ -635,7 +639,6 @@ type Command struct { // broadcast - a simple message, must be composed of up to 3 printable ASCII glyphs (32-126) Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` // move - the bearing for the rover to turn to - // salvage - the direction of the rover Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` } @@ -1487,61 +1490,62 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x60, 0x0a, 0x0b, 0x43, + 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x6e, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, - 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x2a, 0x83, 0x01, - 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, - 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, - 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, - 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, - 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, - 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, - 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, - 0x74, 0x10, 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, - 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, - 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, - 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, - 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, - 0x0e, 0x0a, 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, 0x2a, - 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, - 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, - 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, - 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, - 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, - 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, - 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, - 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, - 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, - 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, + 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x12, 0x0c, 0x0a, + 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x10, 0x07, 0x2a, 0x83, 0x01, 0x0a, 0x07, + 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, + 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, + 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, + 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, + 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, + 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, + 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, + 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, + 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, + 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, + 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, + 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0e, 0x0a, + 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, 0x2a, 0x37, 0x0a, + 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, + 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, + 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, + 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, + 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, + 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, + 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, - 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, - 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, - 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, - 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, + 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, + 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 7acedac..5470e19 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -101,6 +101,8 @@ enum CommandType { broadcast = 5; // Salvages a neighboring dormant rover for parts salvage = 6; + // Transfers remote control into dormant rover + transfer = 7; } // Bearing represents a compass direction From e840b3e47bc09e4e105aa2e89aae3fe62f15ed43 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 20:06:06 +0100 Subject: [PATCH 20/58] Move accountant into world --- cmd/rove-server/internal/routes.go | 14 +++++++------- cmd/rove-server/internal/server.go | 10 +++------- .../internal => pkg/accounts}/accounts.go | 2 +- .../internal => pkg/accounts}/accounts_test.go | 2 +- .../internal => pkg/accounts}/simpleAccountant.go | 2 +- pkg/rove/world.go | 5 +++++ 6 files changed, 18 insertions(+), 17 deletions(-) rename {cmd/rove-server/internal => pkg/accounts}/accounts.go (98%) rename {cmd/rove-server/internal => pkg/accounts}/accounts_test.go (98%) rename {cmd/rove-server/internal => pkg/accounts}/simpleAccountant.go (99%) diff --git a/cmd/rove-server/internal/routes.go b/cmd/rove-server/internal/routes.go index 86becd7..69dd820 100644 --- a/cmd/rove-server/internal/routes.go +++ b/cmd/rove-server/internal/routes.go @@ -34,7 +34,7 @@ func (s *Server) Register(ctx context.Context, req *roveapi.RegisterRequest) (*r return nil, fmt.Errorf("empty account name") } - if acc, err := s.accountant.RegisterAccount(req.Name); err != nil { + if acc, err := s.world.Accountant.RegisterAccount(req.Name); err != nil { return nil, err } else if _, err := s.SpawnRoverForAccount(req.Name); err != nil { @@ -57,13 +57,13 @@ func (s *Server) Register(ctx context.Context, req *roveapi.RegisterRequest) (*r func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (response *roveapi.StatusResponse, err error) { log.Printf("Handling status request: %s\n", req.Account.Name) - if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { + if valid, err := s.world.Accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { return nil, err } else if !valid { return nil, fmt.Errorf("Secret incorrect for account %s", req.Account.Name) - } else if resp, err := s.accountant.GetValue(req.Account.Name, "rover"); err != nil { + } else if resp, err := s.world.Accountant.GetValue(req.Account.Name, "rover"); err != nil { return nil, err } else if rover, err := s.world.GetRover(resp); err != nil { @@ -117,7 +117,7 @@ func (s *Server) Status(ctx context.Context, req *roveapi.StatusRequest) (respon func (s *Server) Radar(ctx context.Context, req *roveapi.RadarRequest) (*roveapi.RadarResponse, error) { log.Printf("Handling radar request: %s\n", req.Account.Name) - if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { + if valid, err := s.world.Accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { return nil, err } else if !valid { @@ -126,7 +126,7 @@ func (s *Server) Radar(ctx context.Context, req *roveapi.RadarRequest) (*roveapi response := &roveapi.RadarResponse{} - resp, err := s.accountant.GetValue(req.Account.Name, "rover") + resp, err := s.world.Accountant.GetValue(req.Account.Name, "rover") if err != nil { return nil, err @@ -149,14 +149,14 @@ func (s *Server) Radar(ctx context.Context, req *roveapi.RadarRequest) (*roveapi func (s *Server) Command(ctx context.Context, req *roveapi.CommandRequest) (*roveapi.CommandResponse, error) { log.Printf("Handling command request: %s and %+v\n", req.Account.Name, req.Commands) - if valid, err := s.accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { + if valid, err := s.world.Accountant.VerifySecret(req.Account.Name, req.Account.Secret); err != nil { return nil, err } else if !valid { return nil, fmt.Errorf("Secret incorrect for account %s", req.Account.Name) } - resp, err := s.accountant.GetValue(req.Account.Name, "rover") + resp, err := s.world.Accountant.GetValue(req.Account.Name, "rover") if err != nil { return nil, err } diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 786eb00..564656e 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -27,9 +27,6 @@ type Server struct { // Internal state world *rove.World - // Accountant - accountant Accountant - // gRPC server netListener net.Listener grpcServ *grpc.Server @@ -80,7 +77,6 @@ func NewServer(opts ...ServerOption) *Server { persistence: EphemeralData, schedule: cron.New(), world: rove.NewWorld(32), - accountant: NewSimpleAccountant(), } // Apply all options @@ -188,7 +184,7 @@ func (s *Server) SaveWorld() error { if s.persistence == PersistentData { s.world.RLock() defer s.world.RUnlock() - if err := persistence.SaveAll("world", s.world, "accounts", s.accountant); err != nil { + if err := persistence.SaveAll("world", s.world); err != nil { return fmt.Errorf("failed to save out persistent data: %s", err) } } @@ -200,7 +196,7 @@ func (s *Server) LoadWorld() error { if s.persistence == PersistentData { s.world.Lock() defer s.world.Unlock() - if err := persistence.LoadAll("world", &s.world, "accounts", &s.accountant); err != nil { + if err := persistence.LoadAll("world", &s.world); err != nil { return err } } @@ -214,7 +210,7 @@ func (s *Server) SpawnRoverForAccount(account string) (string, error) { return "", err } - err = s.accountant.AssignData(account, "rover", inst) + err = s.world.Accountant.AssignData(account, "rover", inst) if err != nil { log.Printf("Failed to assign rover to account, %s", err) diff --git a/cmd/rove-server/internal/accounts.go b/pkg/accounts/accounts.go similarity index 98% rename from cmd/rove-server/internal/accounts.go rename to pkg/accounts/accounts.go index 9ae6db9..eb8637d 100644 --- a/cmd/rove-server/internal/accounts.go +++ b/pkg/accounts/accounts.go @@ -1,4 +1,4 @@ -package internal +package accounts // Accountant decribes something that stores accounts and account values type Accountant interface { diff --git a/cmd/rove-server/internal/accounts_test.go b/pkg/accounts/accounts_test.go similarity index 98% rename from cmd/rove-server/internal/accounts_test.go rename to pkg/accounts/accounts_test.go index 9e7891f..bd2416f 100644 --- a/cmd/rove-server/internal/accounts_test.go +++ b/pkg/accounts/accounts_test.go @@ -1,4 +1,4 @@ -package internal +package accounts import ( "testing" diff --git a/cmd/rove-server/internal/simpleAccountant.go b/pkg/accounts/simpleAccountant.go similarity index 99% rename from cmd/rove-server/internal/simpleAccountant.go rename to pkg/accounts/simpleAccountant.go index 611ff59..9d6c43f 100644 --- a/cmd/rove-server/internal/simpleAccountant.go +++ b/pkg/accounts/simpleAccountant.go @@ -1,4 +1,4 @@ -package internal +package accounts import ( "fmt" diff --git a/pkg/rove/world.go b/pkg/rove/world.go index afe7605..0d828ae 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -7,6 +7,7 @@ import ( "math/rand" "sync" + "github.com/mdiluz/rove/pkg/accounts" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" ) @@ -40,6 +41,9 @@ type World struct { // Commands is the set of currently executing command streams per rover CommandQueue map[string]CommandStream + // Accountant + Accountant accounts.Accountant + // Mutex to lock around all world operations worldMutex sync.RWMutex // Mutex to lock around command operations @@ -54,6 +58,7 @@ func NewWorld(chunkSize int) *World { Atlas: NewChunkAtlas(chunkSize), TicksPerDay: 24, CurrentTicks: 0, + Accountant: accounts.NewSimpleAccountant(), } } From 6f2d67bd7c14e312cc5b44acef62addd2a8aa93e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:22:32 +0100 Subject: [PATCH 21/58] Tag rovers by the controlling account --- cmd/rove-server/internal/server.go | 2 +- pkg/rove/command_test.go | 14 +++++++------- pkg/rove/rover.go | 3 +++ pkg/rove/world.go | 12 ++++++++++-- pkg/rove/world_test.go | 26 +++++++++++++------------- 5 files changed, 34 insertions(+), 23 deletions(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 564656e..42392f3 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -205,7 +205,7 @@ func (s *Server) LoadWorld() error { // SpawnRoverForAccount spawns the rover rover for an account func (s *Server) SpawnRoverForAccount(account string) (string, error) { - inst, err := s.world.SpawnRover() + inst, err := s.world.SpawnRover(account) if err != nil { return "", err } diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 9a8a35a..6560e53 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -10,7 +10,7 @@ import ( func TestCommand_Toggle(t *testing.T) { w := NewWorld(8) - a, err := w.SpawnRover() + a, err := w.SpawnRover("tmp") assert.NoError(t, err) r, err := w.GetRover(a) @@ -36,7 +36,7 @@ func TestCommand_Toggle(t *testing.T) { func TestCommand_Turn(t *testing.T) { w := NewWorld(8) - a, err := w.SpawnRover() + a, err := w.SpawnRover("tmp") assert.NoError(t, err) err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Bearing: roveapi.Bearing_NorthWest}) @@ -50,7 +50,7 @@ func TestCommand_Turn(t *testing.T) { func TestCommand_Stash(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover() + name, err := w.SpawnRover("tmp") assert.NoError(t, err) info, err := w.GetRover(name) @@ -78,7 +78,7 @@ func TestCommand_Stash(t *testing.T) { func TestCommand_Repair(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover() + name, err := w.SpawnRover("tmp") assert.NoError(t, err) info, err := w.GetRover(name) @@ -118,7 +118,7 @@ func TestCommand_Repair(t *testing.T) { func TestCommand_Broadcast(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover() + name, err := w.SpawnRover("tmp") assert.NoError(t, err) // Enqueue the broadcast and tick @@ -133,7 +133,7 @@ func TestCommand_Broadcast(t *testing.T) { func TestCommand_Salvage(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover() + name, err := w.SpawnRover("tmp") assert.NoError(t, err) info, err := w.GetRover(name) @@ -161,7 +161,7 @@ func TestCommand_Salvage(t *testing.T) { func TestCommand_Invalid(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover() + name, err := w.SpawnRover("tmp") assert.NoError(t, err) err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_none}) diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index ce0edcd..d0fb9cb 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -66,6 +66,9 @@ type Rover struct { // Logs Stores log of information Logs []RoverLogEntry + + // The account that owns this rover + Owner string } // DefaultRover returns a default rover object with default settings diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 0d828ae..922ab70 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -63,13 +63,16 @@ func NewWorld(chunkSize int) *World { } // SpawnRover adds an rover to the game -func (w *World) SpawnRover() (string, error) { +func (w *World) SpawnRover(account string) (string, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() // Initialise the rover rover := DefaultRover() + // Assign the owner + rover.Owner = account + // Spawn in a random place near the origin rover.Pos = maths.Vector{ X: 10 - rand.Intn(20), @@ -375,6 +378,9 @@ func (w *World) RoverTransfer(rover string) (string, error) { oldRover.AddLogEntryf("transferring to dormant rover %s", newRover.Name) newRover.AddLogEntryf("transferred from rover %s", oldRover.Name) + // Clear the old owner + oldRover.Owner = "" + // Marshal old rover oldRoverData, err := json.Marshal(oldRover) if err != nil { @@ -384,7 +390,9 @@ func (w *World) RoverTransfer(rover string) (string, error) { // Add this new rover to tracking w.Rovers[newRover.Name] = &newRover - // TODO: Swap account rover to the dormant one + // Swap account rover to the dormant one + newRover.Owner = oldRover.Owner + w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name) // Place the old rover into the world w.Atlas.SetObject(oldRover.Pos, Object{Type: roveapi.Object_RoverDormant, Data: oldRoverData}) diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index e1fa700..d0c4c01 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -18,9 +18,9 @@ func TestNewWorld(t *testing.T) { func TestWorld_CreateRover(t *testing.T) { world := NewWorld(8) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) - b, err := world.SpawnRover() + b, err := world.SpawnRover("tmp") assert.NoError(t, err) // Basic duplicate check @@ -33,7 +33,7 @@ func TestWorld_CreateRover(t *testing.T) { func TestWorld_GetRover(t *testing.T) { world := NewWorld(4) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) rover, err := world.GetRover(a) @@ -44,9 +44,9 @@ func TestWorld_GetRover(t *testing.T) { func TestWorld_DestroyRover(t *testing.T) { world := NewWorld(1) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) - b, err := world.SpawnRover() + b, err := world.SpawnRover("tmp") assert.NoError(t, err) err = world.DestroyRover(a) @@ -62,7 +62,7 @@ func TestWorld_DestroyRover(t *testing.T) { func TestWorld_GetSetMovePosition(t *testing.T) { world := NewWorld(4) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) pos := maths.Vector{ @@ -97,9 +97,9 @@ func TestWorld_GetSetMovePosition(t *testing.T) { func TestWorld_RadarFromRover(t *testing.T) { // Create world that should have visible walls on the radar world := NewWorld(2) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) - b, err := world.SpawnRover() + b, err := world.SpawnRover("tmp") assert.NoError(t, err) // Warp the rovers into position @@ -130,7 +130,7 @@ func TestWorld_RadarFromRover(t *testing.T) { func TestWorld_RoverDamage(t *testing.T) { world := NewWorld(2) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) pos := maths.Vector{ @@ -160,7 +160,7 @@ func TestWorld_RoverDamage(t *testing.T) { func TestWorld_Daytime(t *testing.T) { world := NewWorld(1) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) // Remove rover charge @@ -199,10 +199,10 @@ func TestWorld_Daytime(t *testing.T) { func TestWorld_Broadcast(t *testing.T) { world := NewWorld(8) - a, err := world.SpawnRover() + a, err := world.SpawnRover("tmp") assert.NoError(t, err) - b, err := world.SpawnRover() + b, err := world.SpawnRover("tmp") assert.NoError(t, err) // Warp rovers near to eachother @@ -265,7 +265,7 @@ func TestWorld_Sailing(t *testing.T) { world.Tick() // One initial tick to set the wind direction the first time world.Wind = roveapi.Bearing_North // Set the wind direction to north - name, err := world.SpawnRover() + name, err := world.SpawnRover("tmp") assert.NoError(t, err) // Warp the rover to 0,0 after clearing it From fdfcc88540587ead99d016ebf9e0e69c5e78ddb6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:50:35 +0100 Subject: [PATCH 22/58] Move the account registration into the world --- cmd/rove-server/internal/server.go | 12 ------------ pkg/rove/world.go | 2 +- 2 files changed, 1 insertion(+), 13 deletions(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 42392f3..7debe0a 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -210,17 +210,5 @@ func (s *Server) SpawnRoverForAccount(account string) (string, error) { return "", err } - err = s.world.Accountant.AssignData(account, "rover", inst) - if err != nil { - log.Printf("Failed to assign rover to account, %s", err) - - // Try and clear up the rover - if err := s.world.DestroyRover(inst); err != nil { - log.Printf("Failed to destroy rover after failed rover assign: %s", err) - } - - return "", err - } - return inst, nil } diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 922ab70..09d271a 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -97,7 +97,7 @@ func (w *World) SpawnRover(account string) (string, error) { // Append the rover to the list w.Rovers[rover.Name] = rover - return rover.Name, nil + return rover.Name, w.Accountant.AssignData(account, "rover", rover.Name) } // GetRover gets a specific rover by name From 57621d169aaa0669484eef832f9ee8f3678f5176 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:50:47 +0100 Subject: [PATCH 23/58] Implement a test for transfer and fix bugs --- pkg/rove/command_test.go | 52 ++++++++++++++++++++++++++++++++++++++++ pkg/rove/world.go | 27 +++++++++++---------- 2 files changed, 66 insertions(+), 13 deletions(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 6560e53..13b95bf 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -1,6 +1,7 @@ package rove import ( + "encoding/json" "testing" "github.com/mdiluz/rove/pkg/maths" @@ -159,6 +160,57 @@ func TestCommand_Salvage(t *testing.T) { assert.Equal(t, roveapi.Object_ObjectUnknown, obj.Type) } +func TestCommand_Transfer(t *testing.T) { + w := NewWorld(8) + acc, err := w.Accountant.RegisterAccount("tmp") + assert.NoError(t, err) + nameA, err := w.SpawnRover(acc.Name) + assert.NoError(t, err) + + infoA, err := w.GetRover(nameA) + assert.NoError(t, err) + + // Drop a dormant rover on the current position + infoB := DefaultRover() + infoB.Name = "abc" + infoB.Pos = infoA.Pos + data, err := json.Marshal(infoB) + assert.NoError(t, err) + w.Atlas.SetObject(infoA.Pos, Object{Type: roveapi.Object_RoverDormant, Data: data}) + + // Enqueue a transfer as well as a dud command + err = w.Enqueue(nameA, + &roveapi.Command{Command: roveapi.CommandType_transfer}, + &roveapi.Command{Command: roveapi.CommandType_broadcast, Data: []byte("xyz")}) + assert.NoError(t, err) + w.Tick() + + // Ensure both command queues are empty + assert.Empty(t, w.CommandQueue[nameA]) + assert.Empty(t, w.CommandQueue[infoB.Name]) + + // Verify the account now controls the new rover + accountRover, err := w.Accountant.GetValue(acc.Name, "rover") + assert.NoError(t, err) + assert.Equal(t, infoB.Name, accountRover) + + // Verify the position now has a dormant rover + _, obj := w.Atlas.QueryPosition(infoA.Pos) + assert.Equal(t, roveapi.Object_RoverDormant, obj.Type) + + // Verify the stored data matches + var stored Rover + err = json.Unmarshal(obj.Data, &stored) + assert.NoError(t, err) + assert.Equal(t, infoA.Name, stored.Name) + + // Verify the new rover data matches what we put in + infoB2, err := w.GetRover(infoB.Name) + assert.NoError(t, err) + assert.Equal(t, infoB.Name, infoB2.Name) + +} + func TestCommand_Invalid(t *testing.T) { w := NewWorld(8) name, err := w.SpawnRover("tmp") diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 09d271a..bf68395 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -378,28 +378,26 @@ func (w *World) RoverTransfer(rover string) (string, error) { oldRover.AddLogEntryf("transferring to dormant rover %s", newRover.Name) newRover.AddLogEntryf("transferred from rover %s", oldRover.Name) - // Clear the old owner + // Transfer the ownership + w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name) + newRover.Owner = oldRover.Owner oldRover.Owner = "" - // Marshal old rover + // Place the old rover in the world oldRoverData, err := json.Marshal(oldRover) if err != nil { return "", err } - - // Add this new rover to tracking - w.Rovers[newRover.Name] = &newRover - - // Swap account rover to the dormant one - newRover.Owner = oldRover.Owner - w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name) - - // Place the old rover into the world w.Atlas.SetObject(oldRover.Pos, Object{Type: roveapi.Object_RoverDormant, Data: oldRoverData}) - // Remove old rover from current tracking + // Swap the rovers in the tracking + w.Rovers[newRover.Name] = &newRover delete(w.Rovers, oldRover.Name) + // Clear the command queues for both rovers + delete(w.CommandQueue, oldRover.Name) + delete(w.CommandQueue, newRover.Name) + return newRover.Name, nil } @@ -599,7 +597,10 @@ func (w *World) Tick() { } // Extract the first command in the queue - w.CommandQueue[rover] = cmds[1:] + // Only if the command queue still has entries + if _, ok := w.CommandQueue[rover]; ok { + w.CommandQueue[rover] = cmds[1:] + } } else { // Clean out the empty entry From a93ce97b0bcfe4e21331e6d0d31f3b00a5e3805b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:54:06 +0100 Subject: [PATCH 24/58] Only assign rovers to accounts if given an account --- pkg/rove/command_test.go | 14 +++++++------- pkg/rove/world.go | 8 +++++++- pkg/rove/world_test.go | 26 +++++++++++++------------- 3 files changed, 27 insertions(+), 21 deletions(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 13b95bf..935e35d 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -11,7 +11,7 @@ import ( func TestCommand_Toggle(t *testing.T) { w := NewWorld(8) - a, err := w.SpawnRover("tmp") + a, err := w.SpawnRover("") assert.NoError(t, err) r, err := w.GetRover(a) @@ -37,7 +37,7 @@ func TestCommand_Toggle(t *testing.T) { func TestCommand_Turn(t *testing.T) { w := NewWorld(8) - a, err := w.SpawnRover("tmp") + a, err := w.SpawnRover("") assert.NoError(t, err) err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_turn, Bearing: roveapi.Bearing_NorthWest}) @@ -51,7 +51,7 @@ func TestCommand_Turn(t *testing.T) { func TestCommand_Stash(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("tmp") + name, err := w.SpawnRover("") assert.NoError(t, err) info, err := w.GetRover(name) @@ -79,7 +79,7 @@ func TestCommand_Stash(t *testing.T) { func TestCommand_Repair(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("tmp") + name, err := w.SpawnRover("") assert.NoError(t, err) info, err := w.GetRover(name) @@ -119,7 +119,7 @@ func TestCommand_Repair(t *testing.T) { func TestCommand_Broadcast(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("tmp") + name, err := w.SpawnRover("") assert.NoError(t, err) // Enqueue the broadcast and tick @@ -134,7 +134,7 @@ func TestCommand_Broadcast(t *testing.T) { func TestCommand_Salvage(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("tmp") + name, err := w.SpawnRover("") assert.NoError(t, err) info, err := w.GetRover(name) @@ -213,7 +213,7 @@ func TestCommand_Transfer(t *testing.T) { func TestCommand_Invalid(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("tmp") + name, err := w.SpawnRover("") assert.NoError(t, err) err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_none}) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index bf68395..3d651da 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -97,7 +97,13 @@ func (w *World) SpawnRover(account string) (string, error) { // Append the rover to the list w.Rovers[rover.Name] = rover - return rover.Name, w.Accountant.AssignData(account, "rover", rover.Name) + var err error + // Only assign if we've been given an account + if len(account) > 0 { + err = w.Accountant.AssignData(account, "rover", rover.Name) + } + + return rover.Name, err } // GetRover gets a specific rover by name diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index d0c4c01..747a891 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -18,9 +18,9 @@ func TestNewWorld(t *testing.T) { func TestWorld_CreateRover(t *testing.T) { world := NewWorld(8) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) - b, err := world.SpawnRover("tmp") + b, err := world.SpawnRover("") assert.NoError(t, err) // Basic duplicate check @@ -33,7 +33,7 @@ func TestWorld_CreateRover(t *testing.T) { func TestWorld_GetRover(t *testing.T) { world := NewWorld(4) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) rover, err := world.GetRover(a) @@ -44,9 +44,9 @@ func TestWorld_GetRover(t *testing.T) { func TestWorld_DestroyRover(t *testing.T) { world := NewWorld(1) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) - b, err := world.SpawnRover("tmp") + b, err := world.SpawnRover("") assert.NoError(t, err) err = world.DestroyRover(a) @@ -62,7 +62,7 @@ func TestWorld_DestroyRover(t *testing.T) { func TestWorld_GetSetMovePosition(t *testing.T) { world := NewWorld(4) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) pos := maths.Vector{ @@ -97,9 +97,9 @@ func TestWorld_GetSetMovePosition(t *testing.T) { func TestWorld_RadarFromRover(t *testing.T) { // Create world that should have visible walls on the radar world := NewWorld(2) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) - b, err := world.SpawnRover("tmp") + b, err := world.SpawnRover("") assert.NoError(t, err) // Warp the rovers into position @@ -130,7 +130,7 @@ func TestWorld_RadarFromRover(t *testing.T) { func TestWorld_RoverDamage(t *testing.T) { world := NewWorld(2) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) pos := maths.Vector{ @@ -160,7 +160,7 @@ func TestWorld_RoverDamage(t *testing.T) { func TestWorld_Daytime(t *testing.T) { world := NewWorld(1) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) // Remove rover charge @@ -199,10 +199,10 @@ func TestWorld_Daytime(t *testing.T) { func TestWorld_Broadcast(t *testing.T) { world := NewWorld(8) - a, err := world.SpawnRover("tmp") + a, err := world.SpawnRover("") assert.NoError(t, err) - b, err := world.SpawnRover("tmp") + b, err := world.SpawnRover("") assert.NoError(t, err) // Warp rovers near to eachother @@ -265,7 +265,7 @@ func TestWorld_Sailing(t *testing.T) { world.Tick() // One initial tick to set the wind direction the first time world.Wind = roveapi.Bearing_North // Set the wind direction to north - name, err := world.SpawnRover("tmp") + name, err := world.SpawnRover("") assert.NoError(t, err) // Warp the rover to 0,0 after clearing it From a0e04b7e3a287ee842d9240edd57f18e7e4271d3 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:56:35 +0100 Subject: [PATCH 25/58] Placed dormant world rovers randomly have better base stats --- pkg/rove/worldgen.go | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index e36b7b6..724837d 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -3,6 +3,7 @@ package rove import ( "encoding/json" "log" + "math/rand" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" @@ -76,6 +77,12 @@ func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { // Set the rover variables r.Pos = v + // Upgrade this rover randomly + r.MaximumCharge += rand.Int() % 3 + r.MaximumIntegrity += rand.Int() % 3 + r.Capacity += rand.Int() % 3 + r.Range += rand.Int() % 3 + // For now, mark the log as corrupted r.AddLogEntryf("log corrupted") From 7be0f83c5ea64bdcaf3635bc747e664fb54eaf20 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 22:58:59 +0100 Subject: [PATCH 26/58] Fix golanglint missing error check --- pkg/rove/world.go | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 3d651da..27ded3b 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -385,7 +385,10 @@ func (w *World) RoverTransfer(rover string) (string, error) { newRover.AddLogEntryf("transferred from rover %s", oldRover.Name) // Transfer the ownership - w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name) + err = w.Accountant.AssignData(oldRover.Owner, "rover", newRover.Name) + if err != nil { + return "", err + } newRover.Owner = oldRover.Owner oldRover.Owner = "" From 5d4fd801c108607b07979eaade39dc05333a9bab Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Fri, 24 Jul 2020 23:22:46 +0100 Subject: [PATCH 27/58] Add the starting wind as north and ensure it's only updated the next day --- pkg/rove/world.go | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 27ded3b..7e22323 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -59,6 +59,7 @@ func NewWorld(chunkSize int) *World { TicksPerDay: 24, CurrentTicks: 0, Accountant: accounts.NewSimpleAccountant(), + Wind: roveapi.Bearing_North, } } @@ -617,11 +618,6 @@ func (w *World) Tick() { } } - // Change the wind every day - if (w.CurrentTicks % w.TicksPerDay) == 0 { - w.Wind = roveapi.Bearing((rand.Int() % 8) + 1) // Random cardinal bearing - } - // Move all the rovers based on current wind and sails for n, r := range w.Rovers { // Skip if we're not catching the wind @@ -675,6 +671,11 @@ func (w *World) Tick() { // Increment the current tick count w.CurrentTicks++ + + // Change the wind every day + if (w.CurrentTicks % w.TicksPerDay) == 0 { + w.Wind = roveapi.Bearing((rand.Int() % 8) + 1) // Random cardinal bearing + } } // ExecuteCommand will execute a single command From f9b3ce3edbd6087987c1b79dae97568f33f973db Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 25 Jul 2020 23:13:05 +0100 Subject: [PATCH 28/58] Destroy the rover when it has 0 integrity --- pkg/rove/world.go | 44 +++++++++++++++++++++++++++++++++--------- pkg/rove/world_test.go | 20 +++++++++++++++++-- 2 files changed, 53 insertions(+), 11 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 7e22323..ea1fdd3 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -67,7 +67,11 @@ func NewWorld(chunkSize int) *World { func (w *World) SpawnRover(account string) (string, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() + return w.spawnRover(account) +} +// spawnRover adds an rover to the game (without lock) +func (w *World) spawnRover(account string) (string, error) { // Initialise the rover rover := DefaultRover() @@ -176,17 +180,28 @@ func (w *World) RoverBroadcast(rover string, message []byte) (err error) { return } -// DestroyRover Removes an rover from the game -func (w *World) DestroyRover(rover string) error { - w.worldMutex.Lock() - defer w.worldMutex.Unlock() - - _, ok := w.Rovers[rover] +// destroyRover Removes an rover from the game +func (w *World) destroyRover(rover string) error { + r, ok := w.Rovers[rover] if !ok { return fmt.Errorf("no rover matching id") } + // Remove this rover from tracked rovers delete(w.Rovers, rover) + + r.Owner = "" + r.AddLogEntryf("rover destroyed") + + // Marshal the rover data + data, err := json.Marshal(r) + if err != nil { + return err + } + + // Place the dormant rover down + w.Atlas.SetObject(r.Pos, Object{Type: roveapi.Object_RoverDormant, Data: data}) + return nil } @@ -276,9 +291,20 @@ func (w *World) TryMoveRover(rover string, b roveapi.Bearing) (maths.Vector, err i.AddLogEntryf("tried to move %s to %+v", b.String(), newPos) i.Integrity = i.Integrity - 1 i.AddLogEntryf("had a collision, new integrity %d", i.Integrity) - // TODO: The rover needs to be left dormant with the player - //if i.Integrity == 0 { - //} + + if i.Integrity == 0 { + // The rover has died destroy it + err := w.destroyRover(rover) + if err != nil { + return maths.Vector{}, err + } + + // Spawn a new one for this account + _, err = w.spawnRover(i.Owner) + if err != nil { + return maths.Vector{}, err + } + } } return i.Pos, nil diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 747a891..8363c0b 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -49,7 +49,7 @@ func TestWorld_DestroyRover(t *testing.T) { b, err := world.SpawnRover("") assert.NoError(t, err) - err = world.DestroyRover(a) + err = world.destroyRover(a) assert.NoError(t, err, "Error returned from rover destroy") // Basic duplicate check @@ -130,7 +130,9 @@ func TestWorld_RadarFromRover(t *testing.T) { func TestWorld_RoverDamage(t *testing.T) { world := NewWorld(2) - a, err := world.SpawnRover("") + acc, err := world.Accountant.RegisterAccount("tmp") + assert.NoError(t, err) + a, err := world.SpawnRover(acc.Name) assert.NoError(t, err) pos := maths.Vector{ @@ -155,6 +157,20 @@ func TestWorld_RoverDamage(t *testing.T) { assert.NoError(t, err, "couldn't get rover info") assert.Equal(t, info.Integrity-1, newinfo.Integrity, "rover should have lost integrity") assert.Contains(t, newinfo.Logs[len(newinfo.Logs)-1].Text, "collision", "Rover logs should contain the collision") + + // Keep moving to damage the rover + for i := 0; i < info.Integrity-1; i++ { + vec, err := world.TryMoveRover(a, roveapi.Bearing_North) + assert.NoError(t, err, "Failed to move rover") + assert.Equal(t, pos, vec, "Rover managed to move into large rock") + } + + // Rover should have been destroyed now + _, err = world.GetRover(a) + assert.Error(t, err) + + _, obj := world.Atlas.QueryPosition(info.Pos) + assert.Equal(t, roveapi.Object_RoverDormant, obj.Type) } func TestWorld_Daytime(t *testing.T) { From cd97220a11969c3219fa8f9ea965d6d4631d3295 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 25 Jul 2020 23:18:21 +0100 Subject: [PATCH 29/58] Perform rover destruction during the main server tick --- pkg/rove/world.go | 46 +++++++++++++++++++++++------------------- pkg/rove/world_test.go | 5 ++++- 2 files changed, 29 insertions(+), 22 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index ea1fdd3..dc163f3 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -63,15 +63,11 @@ func NewWorld(chunkSize int) *World { } } -// SpawnRover adds an rover to the game +// SpawnRover adds an rover to the game (without lock) func (w *World) SpawnRover(account string) (string, error) { w.worldMutex.Lock() defer w.worldMutex.Unlock() - return w.spawnRover(account) -} -// spawnRover adds an rover to the game (without lock) -func (w *World) spawnRover(account string) (string, error) { // Initialise the rover rover := DefaultRover() @@ -180,8 +176,11 @@ func (w *World) RoverBroadcast(rover string, message []byte) (err error) { return } -// destroyRover Removes an rover from the game -func (w *World) destroyRover(rover string) error { +// DestroyRover Removes an rover from the game +func (w *World) DestroyRover(rover string) error { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + r, ok := w.Rovers[rover] if !ok { return fmt.Errorf("no rover matching id") @@ -291,20 +290,6 @@ func (w *World) TryMoveRover(rover string, b roveapi.Bearing) (maths.Vector, err i.AddLogEntryf("tried to move %s to %+v", b.String(), newPos) i.Integrity = i.Integrity - 1 i.AddLogEntryf("had a collision, new integrity %d", i.Integrity) - - if i.Integrity == 0 { - // The rover has died destroy it - err := w.destroyRover(rover) - if err != nil { - return maths.Vector{}, err - } - - // Spawn a new one for this account - _, err = w.spawnRover(i.Owner) - if err != nil { - return maths.Vector{}, err - } - } } return i.Pos, nil @@ -695,6 +680,25 @@ func (w *World) Tick() { } } + // Check all rover integrities + for _, r := range w.Rovers { + if r.Integrity <= 0 { + // The rover has died destroy it + err := w.DestroyRover(r.Name) + if err != nil { + log.Println(err) + // TODO: Report this error somehow + } + + // Spawn a new one for this account + _, err = w.SpawnRover(r.Owner) + if err != nil { + log.Println(err) + // TODO: Report this error somehow + } + } + } + // Increment the current tick count w.CurrentTicks++ diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index 8363c0b..afc8f53 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -49,7 +49,7 @@ func TestWorld_DestroyRover(t *testing.T) { b, err := world.SpawnRover("") assert.NoError(t, err) - err = world.destroyRover(a) + err = world.DestroyRover(a) assert.NoError(t, err, "Error returned from rover destroy") // Basic duplicate check @@ -165,6 +165,9 @@ func TestWorld_RoverDamage(t *testing.T) { assert.Equal(t, pos, vec, "Rover managed to move into large rock") } + // Tick the world to check for rover deaths + world.Tick() + // Rover should have been destroyed now _, err = world.GetRover(a) assert.Error(t, err) From 113090fbcb5b041d46709804a8ea1a89566f76ab Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 25 Jul 2020 23:39:13 +0100 Subject: [PATCH 30/58] Fix bug where we were still placing psuedo-random objects down --- pkg/rove/chunkAtlas.go | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/pkg/rove/chunkAtlas.go b/pkg/rove/chunkAtlas.go index 88f1102..1903c7b 100644 --- a/pkg/rove/chunkAtlas.go +++ b/pkg/rove/chunkAtlas.go @@ -2,7 +2,6 @@ package rove import ( "log" - "math/rand" "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" @@ -111,15 +110,6 @@ func (a *chunkBasedAtlas) populate(chunk int) { } } - // Set up any objects - for i := 0; i < len(c.Tiles); i++ { - if rand.Intn(16) == 0 { - c.Objects[i] = Object{Type: roveapi.Object_RockLarge} - } else if rand.Intn(32) == 0 { - c.Objects[i] = Object{Type: roveapi.Object_RockSmall} - } - } - a.Chunks[chunk] = c } From 6891ec843968022f51180a9a6069f8001e0e760f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 25 Jul 2020 23:39:32 +0100 Subject: [PATCH 31/58] Adjust the terrain scale to be much larger --- pkg/rove/worldgen.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index 724837d..dd864b8 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -33,7 +33,7 @@ func NewNoiseWorldGen(seed int64) WorldGen { } const ( - terrainNoiseScale = 6 + terrainNoiseScale = 15 rockNoiseScale = 3 ) From cec61a9db75c02e4f0b9c258ea3bb4df42f0052c Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 16:57:43 +0100 Subject: [PATCH 32/58] Big update to help text and add a simple description --- cmd/rove/main.go | 49 ++++++++++++++++++++++++++++++------------------ 1 file changed, 31 insertions(+), 18 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index b3a7ed6..2340d0d 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -22,24 +22,28 @@ var defaultDataPath = path.Join(home, ".local/share/") // Command usage func printUsage() { - fmt.Fprintf(os.Stderr, "Usage: rove COMMAND [ARGS...]\n") - fmt.Fprintln(os.Stderr, "\nCommands") - fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") - fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and stores it (use with -name)") - fmt.Fprintln(os.Stderr, "\tcommand COMMAND [VAL...] issue commands to rover, accepts multiple, see below") - fmt.Fprintln(os.Stderr, "\tradar gathers radar data for the current rover") - fmt.Fprintln(os.Stderr, "\tstatus gets status info for current rover") - fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config info, optionally sets host") - fmt.Fprintln(os.Stderr, "\thelp outputs this usage information") - fmt.Fprintln(os.Stderr, "\tversion outputs version info") - fmt.Fprintln(os.Stderr, "\nRover commands:") - fmt.Fprintln(os.Stderr, "\ttoggle toggles the sails, either catching the wind, or charging from the sun") - fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") - fmt.Fprintln(os.Stderr, "\trepair uses an inventory object to repair the rover") - fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") - fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") - fmt.Fprintln(os.Stderr, "\nEnvironment") - fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) + fmt.Fprintln(os.Stderr, "Usage: rove ARG [OPT...]") + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintln(os.Stderr, "Arguments:") + fmt.Fprintln(os.Stderr, "\tversion outputs version") + fmt.Fprintln(os.Stderr, "\thelp outputs this usage text") + fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config, optionally sets host") + fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") + fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") + fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") + fmt.Fprintln(os.Stderr, "\tstatus gets rover status") + fmt.Fprintln(os.Stderr, "\tcommand CMD [VAL...] queues commands, accepts multiple, see below") + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintln(os.Stderr, "Rover commands:") + fmt.Fprintln(os.Stderr, "\ttoggle toggles the current sail mode") + fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") + fmt.Fprintln(os.Stderr, "\trepair repairs the rover using inventory item") + fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") + fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") + fmt.Fprintln(os.Stderr, "\ttransfer transfer's control into a dormant rover") + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintln(os.Stderr, "Environment") + fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) } const gRPCport = 9090 @@ -356,6 +360,15 @@ func InnerMain(command string, args ...string) error { func main() { // Bail without any args if len(os.Args) == 1 { + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintln(os.Stderr, "m mm mmm m m mmm") + fmt.Fprintln(os.Stderr, "#\" \" #\" \"# \"m m\" #\" #") + fmt.Fprintln(os.Stderr, "# # # #m# #\"\"\"\"") + fmt.Fprintln(os.Stderr, "# \"#m#\" # \"#mm\"") + fmt.Fprintf(os.Stderr, "\n") + fmt.Fprintln(os.Stderr, "Rove is an asychronous nomadic game about exploring a planet as part of a loose community.") + fmt.Fprintln(os.Stderr, "Visit https://mdiluz.github.io/rove/ for more information.") + fmt.Fprintf(os.Stderr, "\n") printUsage() os.Exit(1) } From bcf71f0bf9991f25f5f177f0d3d92cf16cbb47c9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 17:09:47 +0100 Subject: [PATCH 33/58] Add a "wait" command with a number --- pkg/rove/command_test.go | 37 ++++- pkg/rove/world.go | 39 +++-- proto/roveapi/roveapi.pb.go | 289 +++++++++++++++++++----------------- proto/roveapi/roveapi.proto | 11 +- 4 files changed, 218 insertions(+), 158 deletions(-) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 935e35d..592b40c 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -9,6 +9,15 @@ import ( "github.com/stretchr/testify/assert" ) +func TestCommand_Invalid(t *testing.T) { + w := NewWorld(8) + name, err := w.SpawnRover("") + assert.NoError(t, err) + + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_none}) + assert.Error(t, err) +} + func TestCommand_Toggle(t *testing.T) { w := NewWorld(8) a, err := w.SpawnRover("") @@ -211,11 +220,31 @@ func TestCommand_Transfer(t *testing.T) { } -func TestCommand_Invalid(t *testing.T) { +func TestCommand_Wait(t *testing.T) { w := NewWorld(8) - name, err := w.SpawnRover("") + a, err := w.SpawnRover("") assert.NoError(t, err) - err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_none}) - assert.Error(t, err) + r, err := w.GetRover(a) + assert.NoError(t, err) + assert.Equal(t, roveapi.SailPosition_SolarCharging, r.SailPosition) + + err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_wait, Number: 5}, &roveapi.Command{Command: roveapi.CommandType_toggle}) + assert.NoError(t, err) + + // Tick 5 times during the wait + for i := 0; i < 5; i++ { + w.Tick() + + r, err = w.GetRover(a) + assert.NoError(t, err) + assert.Equal(t, roveapi.SailPosition_SolarCharging, r.SailPosition) + } + + // One last tick to do the toggle + w.Tick() + + r, err = w.GetRover(a) + assert.NoError(t, err) + assert.Equal(t, roveapi.SailPosition_CatchingWind, r.SailPosition) } diff --git a/pkg/rove/world.go b/pkg/rove/world.go index dc163f3..07e8e5e 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -582,6 +582,10 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { if c.GetBearing() == roveapi.Bearing_BearingUnknown { return fmt.Errorf("turn command given unknown bearing") } + case roveapi.CommandType_wait: + if c.GetNumber() <= 0 { + return fmt.Errorf("wait command must be given positie number of ticks to wait") + } case roveapi.CommandType_toggle: case roveapi.CommandType_stash: case roveapi.CommandType_repair: @@ -612,15 +616,16 @@ func (w *World) Tick() { if len(cmds) != 0 { // Execute the command - if err := w.ExecuteCommand(cmds[0], rover); err != nil { + if done, err := w.ExecuteCommand(cmds[0], rover); err != nil { log.Println(err) // TODO: Report this error somehow - } - // Extract the first command in the queue - // Only if the command queue still has entries - if _, ok := w.CommandQueue[rover]; ok { - w.CommandQueue[rover] = cmds[1:] + } else if done { + // Extract the first command in the queue + // Only if the command queue still has entries (the command may have modified this queue) + if _, ok := w.CommandQueue[rover]; ok { + w.CommandQueue[rover] = cmds[1:] + } } } else { @@ -709,46 +714,50 @@ func (w *World) Tick() { } // ExecuteCommand will execute a single command -func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (err error) { +func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (done bool, err error) { log.Printf("Executing command: %+v for %s\n", c.Command, rover) switch c.Command { case roveapi.CommandType_toggle: if _, err := w.RoverToggle(rover); err != nil { - return err + return true, err } case roveapi.CommandType_stash: if _, err := w.RoverStash(rover); err != nil { - return err + return true, err } case roveapi.CommandType_repair: if _, err := w.RoverRepair(rover); err != nil { - return err + return true, err } case roveapi.CommandType_broadcast: if err := w.RoverBroadcast(rover, c.GetData()); err != nil { - return err + return true, err } case roveapi.CommandType_turn: if _, err := w.RoverTurn(rover, c.GetBearing()); err != nil { - return err + return true, err } case roveapi.CommandType_salvage: if _, err := w.RoverSalvage(rover); err != nil { - return err + return true, err } case roveapi.CommandType_transfer: if _, err := w.RoverTransfer(rover); err != nil { - return err + return true, err } + case roveapi.CommandType_wait: + c.Number-- + return c.Number == 0, nil + default: - return fmt.Errorf("unknown command: %s", c.Command) + return true, fmt.Errorf("unknown command: %s", c.Command) } return diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index cc6fe07..2b4df0b 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -53,6 +53,8 @@ const ( CommandType_salvage CommandType = 6 // Transfers remote control into dormant rover CommandType_transfer CommandType = 7 + // Waits for the specified number of server ticks (requires number) + CommandType_wait CommandType = 8 ) // Enum value maps for CommandType. @@ -66,6 +68,7 @@ var ( 5: "broadcast", 6: "salvage", 7: "transfer", + 8: "wait", } CommandType_value = map[string]int32{ "none": 0, @@ -76,6 +79,7 @@ var ( "broadcast": 5, "salvage": 6, "transfer": 7, + "wait": 8, } ) @@ -640,6 +644,8 @@ type Command struct { Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` // move - the bearing for the rover to turn to Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` + // wait - the number of server ticks to wait + Number int32 `protobuf:"varint,4,opt,name=number,proto3" json:"number,omitempty"` } func (x *Command) Reset() { @@ -695,6 +701,13 @@ func (x *Command) GetBearing() Bearing { return Bearing_BearingUnknown } +func (x *Command) GetNumber() int32 { + if x != nil { + return x.Number + } + return 0 +} + // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState @@ -1408,144 +1421,146 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x79, 0x0a, 0x07, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, - 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x07, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x6a, 0x0a, + 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, + 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, + 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, + 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, + 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, + 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, + 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, + 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, + 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, + 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, + 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, + 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, + 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, + 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, + 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, + 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, + 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, + 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, - 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, - 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, - 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, - 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, - 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, - 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, - 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, - 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, - 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, - 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, - 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, - 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, - 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, - 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, 0x01, - 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, - 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, - 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x04, - 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, - 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, - 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, - 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, - 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x6e, 0x0a, 0x0b, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, - 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, - 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, - 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, - 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, - 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x12, 0x0c, 0x0a, - 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x10, 0x07, 0x2a, 0x83, 0x01, 0x0a, 0x07, - 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, 0x72, 0x69, - 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, 0x4e, - 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x45, - 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, 0x03, 0x12, - 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, 0x12, 0x09, - 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, - 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, 0x73, 0x74, - 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, - 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, - 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, - 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, - 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0e, 0x0a, - 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, 0x2a, 0x37, 0x0a, - 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, - 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, - 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, - 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, - 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, - 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, - 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, - 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, - 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, - 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, - 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, - 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, - 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, + 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, + 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, + 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, + 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, + 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, + 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x78, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, + 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, + 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, + 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, + 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, + 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, + 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x10, 0x08, 0x2a, 0x83, + 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, + 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, + 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, + 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, + 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, + 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, + 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, + 0x73, 0x74, 0x10, 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, + 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, + 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, + 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, + 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, + 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, + 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, + 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, + 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, + 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, + 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, + 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, + 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, + 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, + 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, + 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, + 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, + 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, + 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 5470e19..46cb858 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -103,6 +103,8 @@ enum CommandType { salvage = 6; // Transfers remote control into dormant rover transfer = 7; + // Waits for the specified number of server ticks (requires number) + wait = 8; } // Bearing represents a compass direction @@ -124,11 +126,15 @@ message Command { // The command type CommandType command = 1; - // broadcast - a simple message, must be composed of up to 3 printable ASCII glyphs (32-126) + // broadcast - a simple message, must be composed of up to 3 printable ASCII + // glyphs (32-126) bytes data = 2; // move - the bearing for the rover to turn to Bearing bearing = 3; + + // wait - the number of server ticks to wait + int32 number = 4; } // CommandRequest describes a set of commands to be requested for the rover @@ -164,7 +170,8 @@ enum Object { // RockLarge is a large blocking rock RockLarge = 4; - // RoverParts is one unit of rover parts, used for repairing and fixing the rover + // RoverParts is one unit of rover parts, used for repairing and fixing the + // rover RoverParts = 5; } From 15146035177e6ba8da33bb26861beb70b905a1bb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 17:19:04 +0100 Subject: [PATCH 34/58] Allow number to be used in all commands --- pkg/rove/world.go | 43 +++++++++++-------------------------- proto/roveapi/roveapi.pb.go | 42 +++++++++++++++++++----------------- proto/roveapi/roveapi.proto | 12 +++++------ 3 files changed, 40 insertions(+), 57 deletions(-) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 07e8e5e..4d08c7a 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -717,50 +717,31 @@ func (w *World) Tick() { func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (done bool, err error) { log.Printf("Executing command: %+v for %s\n", c.Command, rover) + // Decrement the number of the command + c.Number-- + switch c.Command { case roveapi.CommandType_toggle: - if _, err := w.RoverToggle(rover); err != nil { - return true, err - } + _, err = w.RoverToggle(rover) case roveapi.CommandType_stash: - if _, err := w.RoverStash(rover); err != nil { - return true, err - } - + _, err = w.RoverStash(rover) case roveapi.CommandType_repair: - if _, err := w.RoverRepair(rover); err != nil { - return true, err - } - + _, err = w.RoverRepair(rover) case roveapi.CommandType_broadcast: - if err := w.RoverBroadcast(rover, c.GetData()); err != nil { - return true, err - } - + err = w.RoverBroadcast(rover, c.GetData()) case roveapi.CommandType_turn: - if _, err := w.RoverTurn(rover, c.GetBearing()); err != nil { - return true, err - } - + _, err = w.RoverTurn(rover, c.GetBearing()) case roveapi.CommandType_salvage: - if _, err := w.RoverSalvage(rover); err != nil { - return true, err - } - + _, err = w.RoverSalvage(rover) case roveapi.CommandType_transfer: - if _, err := w.RoverTransfer(rover); err != nil { - return true, err - } - + _, err = w.RoverTransfer(rover) case roveapi.CommandType_wait: - c.Number-- - return c.Number == 0, nil - + // Nothing to do default: return true, fmt.Errorf("unknown command: %s", c.Command) } - return + return c.Number <= 0, err } // Daytime returns if it's currently daytime diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 2b4df0b..4c0178e 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -53,7 +53,7 @@ const ( CommandType_salvage CommandType = 6 // Transfers remote control into dormant rover CommandType_transfer CommandType = 7 - // Waits for the specified number of server ticks (requires number) + // Waits before performing the next command CommandType_wait CommandType = 8 ) @@ -193,7 +193,8 @@ const ( Object_RockSmall Object = 3 // RockLarge is a large blocking rock Object_RockLarge Object = 4 - // RoverParts is one unit of rover parts, used for repairing and fixing the rover + // RoverParts is one unit of rover parts, used for repairing and fixing the + // rover Object_RoverParts Object = 5 ) @@ -640,12 +641,13 @@ type Command struct { // The command type Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=roveapi.CommandType" json:"command,omitempty"` - // broadcast - a simple message, must be composed of up to 3 printable ASCII glyphs (32-126) - Data []byte `protobuf:"bytes,2,opt,name=data,proto3" json:"data,omitempty"` + // The number of times to execute the command (assumes 1 if not present or 0) + Number int32 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"` + // broadcast - a simple message, must be composed of up to 3 printable ASCII + // glyphs (32-126) + Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` // move - the bearing for the rover to turn to - Bearing Bearing `protobuf:"varint,3,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` - // wait - the number of server ticks to wait - Number int32 `protobuf:"varint,4,opt,name=number,proto3" json:"number,omitempty"` + Bearing Bearing `protobuf:"varint,4,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` } func (x *Command) Reset() { @@ -687,6 +689,13 @@ func (x *Command) GetCommand() CommandType { return CommandType_none } +func (x *Command) GetNumber() int32 { + if x != nil { + return x.Number + } + return 0 +} + func (x *Command) GetData() []byte { if x != nil { return x.Data @@ -701,13 +710,6 @@ func (x *Command) GetBearing() Bearing { return Bearing_BearingUnknown } -func (x *Command) GetNumber() int32 { - if x != nil { - return x.Number - } - return 0 -} - // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState @@ -1425,12 +1427,12 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x6a, 0x0a, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, + 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, + 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x6a, 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 46cb858..21c992b 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -103,7 +103,7 @@ enum CommandType { salvage = 6; // Transfers remote control into dormant rover transfer = 7; - // Waits for the specified number of server ticks (requires number) + // Waits before performing the next command wait = 8; } @@ -126,15 +126,15 @@ message Command { // The command type CommandType command = 1; + // The number of times to execute the command (assumes 1 if not present or 0) + int32 number = 2; + // broadcast - a simple message, must be composed of up to 3 printable ASCII // glyphs (32-126) - bytes data = 2; + bytes data = 3; // move - the bearing for the rover to turn to - Bearing bearing = 3; - - // wait - the number of server ticks to wait - int32 number = 4; + Bearing bearing = 4; } // CommandRequest describes a set of commands to be requested for the rover From c0d4a809c9f88d61a84ad1b23a207adbafd101a6 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 17:31:09 +0100 Subject: [PATCH 35/58] Update command line client to allow specifying command number --- cmd/rove/main.go | 43 +++++++++++++++++++++++++++++-------------- cmd/rove/main_test.go | 4 ++++ 2 files changed, 33 insertions(+), 14 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 2340d0d..6613121 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -8,6 +8,7 @@ import ( "os" "path" "path/filepath" + "strconv" "time" "github.com/mdiluz/rove/cmd/rove/internal" @@ -25,22 +26,23 @@ func printUsage() { fmt.Fprintln(os.Stderr, "Usage: rove ARG [OPT...]") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Arguments:") - fmt.Fprintln(os.Stderr, "\tversion outputs version") - fmt.Fprintln(os.Stderr, "\thelp outputs this usage text") - fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config, optionally sets host") - fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") - fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") - fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") - fmt.Fprintln(os.Stderr, "\tstatus gets rover status") - fmt.Fprintln(os.Stderr, "\tcommand CMD [VAL...] queues commands, accepts multiple, see below") + fmt.Fprintln(os.Stderr, "\tversion outputs version") + fmt.Fprintln(os.Stderr, "\thelp outputs this usage text") + fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config, optionally sets host") + fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") + fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") + fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") + fmt.Fprintln(os.Stderr, "\tstatus gets rover status") + fmt.Fprintln(os.Stderr, "\tcommand [NUM] CMD [VAL...] queues commands, accepts multiple, see below") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Rover commands:") - fmt.Fprintln(os.Stderr, "\ttoggle toggles the current sail mode") - fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") - fmt.Fprintln(os.Stderr, "\trepair repairs the rover using inventory item") - fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") - fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") - fmt.Fprintln(os.Stderr, "\ttransfer transfer's control into a dormant rover") + fmt.Fprintln(os.Stderr, "\ttoggle toggles the current sail mode") + fmt.Fprintln(os.Stderr, "\tstash stores the object at the rover location in the inventory") + fmt.Fprintln(os.Stderr, "\trepair repairs the rover using inventory item") + fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") + fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") + fmt.Fprintln(os.Stderr, "\ttransfer transfer's control into a dormant rover") + fmt.Fprintln(os.Stderr, "\twait waits before performing the next command") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Environment") fmt.Fprintln(os.Stderr, "\tROVE_USER_DATA path to user data, defaults to "+defaultDataPath) @@ -236,6 +238,16 @@ func InnerMain(command string, args ...string) error { // Iterate through each command var commands []*roveapi.Command for i := 0; i < len(args); i++ { + number := 0 + num, err := strconv.Atoi(args[i]) + if err == nil { + number = num + i++ + if i >= len(args) { + return fmt.Errorf("must pass command after number") + } + } + switch args[i] { case "turn": i++ @@ -250,6 +262,7 @@ func InnerMain(command string, args ...string) error { &roveapi.Command{ Command: roveapi.CommandType_turn, Bearing: b, + Number: int32(number), }, ) case "broadcast": @@ -263,6 +276,7 @@ func InnerMain(command string, args ...string) error { &roveapi.Command{ Command: roveapi.CommandType_broadcast, Data: []byte(args[i]), + Number: int32(number), }, ) default: @@ -270,6 +284,7 @@ func InnerMain(command string, args ...string) error { commands = append(commands, &roveapi.Command{ Command: roveapi.CommandType(roveapi.CommandType_value[args[i]]), + Number: int32(number), }, ) } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 2eb564c..50fdf98 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -54,8 +54,12 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("command", "stash")) assert.NoError(t, InnerMain("command", "repair")) assert.NoError(t, InnerMain("command", "broadcast", "abc")) + assert.NoError(t, InnerMain("command", "10", "wait")) + assert.NoError(t, InnerMain("command", "1", "wait", "turn", "NW", "toggle", "broadcast", "zyx")) // Give it malformed commands assert.Error(t, InnerMain("command", "unknown")) assert.Error(t, InnerMain("command", "broadcast")) + assert.Error(t, InnerMain("command", "0", "wait")) + assert.Error(t, InnerMain("command", "1")) } From 74e1cd4564eae3ba165ba3b6f187fd4a2394ecd0 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 18:02:06 +0100 Subject: [PATCH 36/58] Convert number to repeat to avoid confusion --- cmd/rove/main.go | 24 ++++++++++++------------ cmd/rove/main_test.go | 1 - pkg/rove/command_test.go | 4 ++-- pkg/rove/world.go | 10 +++------- proto/roveapi/roveapi.pb.go | 12 ++++++------ proto/roveapi/roveapi.proto | 4 ++-- 6 files changed, 25 insertions(+), 30 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 6613121..9fc853a 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -26,14 +26,14 @@ func printUsage() { fmt.Fprintln(os.Stderr, "Usage: rove ARG [OPT...]") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Arguments:") - fmt.Fprintln(os.Stderr, "\tversion outputs version") - fmt.Fprintln(os.Stderr, "\thelp outputs this usage text") - fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config, optionally sets host") - fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") - fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") - fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") - fmt.Fprintln(os.Stderr, "\tstatus gets rover status") - fmt.Fprintln(os.Stderr, "\tcommand [NUM] CMD [VAL...] queues commands, accepts multiple, see below") + fmt.Fprintln(os.Stderr, "\tversion outputs version") + fmt.Fprintln(os.Stderr, "\thelp outputs this usage text") + fmt.Fprintln(os.Stderr, "\tconfig [HOST] outputs the local config, optionally sets host") + fmt.Fprintln(os.Stderr, "\tserver-status prints the server status") + fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") + fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") + fmt.Fprintln(os.Stderr, "\tstatus gets rover status") + fmt.Fprintln(os.Stderr, "\tcommand [REPEAT] CMD [VAL...] queues commands, accepts multiple in sequence for command values see below") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Rover commands:") fmt.Fprintln(os.Stderr, "\ttoggle toggles the current sail mode") @@ -244,7 +244,7 @@ func InnerMain(command string, args ...string) error { number = num i++ if i >= len(args) { - return fmt.Errorf("must pass command after number") + return fmt.Errorf("must pass command after repeat number") } } @@ -262,7 +262,7 @@ func InnerMain(command string, args ...string) error { &roveapi.Command{ Command: roveapi.CommandType_turn, Bearing: b, - Number: int32(number), + Repeat: int32(number), }, ) case "broadcast": @@ -276,7 +276,7 @@ func InnerMain(command string, args ...string) error { &roveapi.Command{ Command: roveapi.CommandType_broadcast, Data: []byte(args[i]), - Number: int32(number), + Repeat: int32(number), }, ) default: @@ -284,7 +284,7 @@ func InnerMain(command string, args ...string) error { commands = append(commands, &roveapi.Command{ Command: roveapi.CommandType(roveapi.CommandType_value[args[i]]), - Number: int32(number), + Repeat: int32(number), }, ) } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 50fdf98..d0e12d6 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -60,6 +60,5 @@ func Test_InnerMain(t *testing.T) { // Give it malformed commands assert.Error(t, InnerMain("command", "unknown")) assert.Error(t, InnerMain("command", "broadcast")) - assert.Error(t, InnerMain("command", "0", "wait")) assert.Error(t, InnerMain("command", "1")) } diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index 592b40c..dde7070 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -229,10 +229,10 @@ func TestCommand_Wait(t *testing.T) { assert.NoError(t, err) assert.Equal(t, roveapi.SailPosition_SolarCharging, r.SailPosition) - err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_wait, Number: 5}, &roveapi.Command{Command: roveapi.CommandType_toggle}) + err = w.Enqueue(a, &roveapi.Command{Command: roveapi.CommandType_wait, Repeat: 4}, &roveapi.Command{Command: roveapi.CommandType_toggle}) assert.NoError(t, err) - // Tick 5 times during the wait + // Tick 5 times during the wait (1 normal execute + 4) for i := 0; i < 5; i++ { w.Tick() diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 4d08c7a..d2483b5 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -583,9 +583,6 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { return fmt.Errorf("turn command given unknown bearing") } case roveapi.CommandType_wait: - if c.GetNumber() <= 0 { - return fmt.Errorf("wait command must be given positie number of ticks to wait") - } case roveapi.CommandType_toggle: case roveapi.CommandType_stash: case roveapi.CommandType_repair: @@ -717,9 +714,6 @@ func (w *World) Tick() { func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (done bool, err error) { log.Printf("Executing command: %+v for %s\n", c.Command, rover) - // Decrement the number of the command - c.Number-- - switch c.Command { case roveapi.CommandType_toggle: _, err = w.RoverToggle(rover) @@ -741,7 +735,9 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (done bool, err return true, fmt.Errorf("unknown command: %s", c.Command) } - return c.Number <= 0, err + // Decrement the repeat number + c.Repeat-- + return c.Repeat < 0, err } // Daytime returns if it's currently daytime diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 4c0178e..753c058 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -641,8 +641,8 @@ type Command struct { // The command type Command CommandType `protobuf:"varint,1,opt,name=command,proto3,enum=roveapi.CommandType" json:"command,omitempty"` - // The number of times to execute the command (assumes 1 if not present or 0) - Number int32 `protobuf:"varint,2,opt,name=number,proto3" json:"number,omitempty"` + // The number of times to repeat the command after the first + Repeat int32 `protobuf:"varint,2,opt,name=repeat,proto3" json:"repeat,omitempty"` // broadcast - a simple message, must be composed of up to 3 printable ASCII // glyphs (32-126) Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` @@ -689,9 +689,9 @@ func (x *Command) GetCommand() CommandType { return CommandType_none } -func (x *Command) GetNumber() int32 { +func (x *Command) GetRepeat() int32 { if x != nil { - return x.Number + return x.Repeat } return 0 } @@ -1427,8 +1427,8 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x12, 0x0a, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x72, 0x65, 0x70, 0x65, 0x61, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 21c992b..9aad682 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -126,8 +126,8 @@ message Command { // The command type CommandType command = 1; - // The number of times to execute the command (assumes 1 if not present or 0) - int32 number = 2; + // The number of times to repeat the command after the first + int32 repeat = 2; // broadcast - a simple message, must be composed of up to 3 printable ASCII // glyphs (32-126) From e542999b91e167d8b90c63c131ccfed2d0cb6f4b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 18:10:55 +0100 Subject: [PATCH 37/58] Move test deployment out to it's own file --- Makefile | 4 ++-- docker-compose-test.yml | 31 +++++++++++++++++++++++++++++++ docker-compose.yml | 13 ------------- 3 files changed, 33 insertions(+), 15 deletions(-) create mode 100644 docker-compose-test.yml diff --git a/Makefile b/Makefile index b73faf0..be0edcb 100644 --- a/Makefile +++ b/Makefile @@ -22,8 +22,8 @@ test: go test -v ./... @echo Integration tests - docker-compose up --build --exit-code-from=rove-tests --abort-on-container-exit rove-tests - docker-compose down + docker-compose -f docker-compose-test.yml up --build --exit-code-from=rove-tests --abort-on-container-exit rove-tests + docker-compose -f docker-compose-test.yml down go tool cover -html=/tmp/coverage-data/c.out -o /tmp/coverage.html @echo Done, coverage data can be found in /tmp/coverage.html diff --git a/docker-compose-test.yml b/docker-compose-test.yml new file mode 100644 index 0000000..64a71a8 --- /dev/null +++ b/docker-compose-test.yml @@ -0,0 +1,31 @@ +version: '3' + +services: + rove-test-server: + build: + context: . + dockerfile: Dockerfile + image: rove:latest + ports: + - "9090:9090" + environment: + - PORT=9090 + - DATA_PATH=/tmp/ + - WORDS_FILE=data/words_alpha.txt + - TICK_RATE=10 + command: [ "./rove-server"] + + rove-tests: + depends_on: [ rove-test-server ] + build: + context: . + dockerfile: Dockerfile + image: rove:latest + environment: + - ROVE_GRPC=rove-test-server + command: [ "./script/wait-for-it.sh", "rove-test-server:9090", "--", "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] + volumes: + - /tmp/coverage-data:/mnt/coverage-data:rw + + + diff --git a/docker-compose.yml b/docker-compose.yml index f1962a9..f84d876 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -20,17 +20,4 @@ services: - persistent-data:/mnt/rove-server:rw command: [ "./rove-server"] - rove-tests: - depends_on: [ rove-server ] - build: - context: . - dockerfile: Dockerfile - image: rove:latest - environment: - - ROVE_GRPC=rove-server - command: [ "./script/wait-for-it.sh", "rove-server:9090", "--", "go", "test", "-v", "./...", "--tags=integration", "-cover", "-coverprofile=/mnt/coverage-data/c.out", "-count", "1" ] - volumes: - - /tmp/coverage-data:/mnt/coverage-data:rw - - From a321e5d72f3a3356a6ec6621321c50173b372be7 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 22:48:48 +0100 Subject: [PATCH 38/58] Add gRPC reflection to the server --- cmd/rove-server/internal/server.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 7debe0a..e32f64a 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -11,6 +11,7 @@ import ( "github.com/mdiluz/rove/proto/roveapi" "github.com/robfig/cron" "google.golang.org/grpc" + "google.golang.org/grpc/reflection" ) const ( @@ -105,6 +106,7 @@ func (s *Server) Initialise(fillWorld bool) (err error) { } s.grpcServ = grpc.NewServer() roveapi.RegisterRoveServer(s.grpcServ, s) + reflection.Register(s.grpcServ) return nil } From 70d92c2d5ee06c221fdaa3c1df44e03530322b8b Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:10:39 +0100 Subject: [PATCH 39/58] Add TLS to gRPC --- cmd/rove-server/internal/server.go | 20 +++++++++++++++++++- cmd/rove-server/internal/server_test.go | 3 +++ docker-compose-test.yml | 1 + 3 files changed, 23 insertions(+), 1 deletion(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index e32f64a..4969687 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -4,6 +4,8 @@ import ( "fmt" "log" "net" + "os" + "path" "sync" "github.com/mdiluz/rove/pkg/persistence" @@ -11,9 +13,12 @@ import ( "github.com/mdiluz/rove/proto/roveapi" "github.com/robfig/cron" "google.golang.org/grpc" + "google.golang.org/grpc/credentials" "google.golang.org/grpc/reflection" ) +var cert = os.Getenv("CERT_NAME") + const ( // PersistentData will allow the server to load and save it's state PersistentData = iota @@ -104,7 +109,20 @@ func (s *Server) Initialise(fillWorld bool) (err error) { if err != nil { log.Fatalf("failed to listen: %v", err) } - s.grpcServ = grpc.NewServer() + + // Load TLS + var opts []grpc.ServerOption + if len(os.Getenv("NO_TLS")) == 0 { + pem := path.Join("/etc/letsencrypt/live/", cert, "cert.pem") + key := path.Join("/etc/letsencrypt/live/", cert, "privkey.pem") + creds, err := credentials.NewServerTLSFromFile(pem, key) + if err != nil { + log.Fatalf("failed to setup TLS: %v", err) + } + opts = append(opts, grpc.Creds(creds)) + } + + s.grpcServ = grpc.NewServer(opts...) roveapi.RegisterRoveServer(s.grpcServ, s) reflection.Register(s.grpcServ) diff --git a/cmd/rove-server/internal/server_test.go b/cmd/rove-server/internal/server_test.go index 36db679..40d4b80 100644 --- a/cmd/rove-server/internal/server_test.go +++ b/cmd/rove-server/internal/server_test.go @@ -1,6 +1,7 @@ package internal import ( + "os" "testing" ) @@ -30,6 +31,7 @@ func TestNewServer_OptionPersistentData(t *testing.T) { } func TestServer_Run(t *testing.T) { + os.Setenv("NO_TLS", "1") server := NewServer() if server == nil { t.Error("Failed to create server") @@ -45,6 +47,7 @@ func TestServer_Run(t *testing.T) { } func TestServer_RunPersistentData(t *testing.T) { + os.Setenv("NO_TLS", "1") server := NewServer(OptionPersistentData()) if server == nil { t.Error("Failed to create server") diff --git a/docker-compose-test.yml b/docker-compose-test.yml index 64a71a8..aec8cee 100644 --- a/docker-compose-test.yml +++ b/docker-compose-test.yml @@ -13,6 +13,7 @@ services: - DATA_PATH=/tmp/ - WORDS_FILE=data/words_alpha.txt - TICK_RATE=10 + - NO_TLS=1 command: [ "./rove-server"] rove-tests: From ac3844fe7af5da3fb1d685ed8cd081d1fc141c88 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:26:36 +0100 Subject: [PATCH 40/58] Mount letsencrypt in the docker to read the certs --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index f84d876..05dd68f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,6 +18,7 @@ services: - TICK_RATE=3 volumes: - persistent-data:/mnt/rove-server:rw + - /etc/letsencrypt/:/etc/letsencrypt/ command: [ "./rove-server"] From 4821a901434ef4072afe62c728083b20dc31abcf Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:29:58 +0100 Subject: [PATCH 41/58] Pass the cert name into the docker deployment --- docker-compose.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/docker-compose.yml b/docker-compose.yml index 05dd68f..d5606f7 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,6 +16,7 @@ services: - DATA_PATH=/mnt/rove-server - WORDS_FILE=data/words_alpha.txt - TICK_RATE=3 + - CERT_NAME=${CERT_NAME} volumes: - persistent-data:/mnt/rove-server:rw - /etc/letsencrypt/:/etc/letsencrypt/ From 9b03ffb7f1a0cf4cb41d7f40fd4917dd86483971 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:30:09 +0100 Subject: [PATCH 42/58] Add skip verify on the client for now --- cmd/rove/main.go | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 9fc853a..99a1f77 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -1,6 +1,7 @@ package main import ( + "crypto/tls" "encoding/json" "fmt" "io/ioutil" @@ -16,6 +17,7 @@ import ( "github.com/mdiluz/rove/proto/roveapi" "golang.org/x/net/context" "google.golang.org/grpc" + "google.golang.org/grpc/credentials" ) var home = os.Getenv("HOME") @@ -185,8 +187,12 @@ func InnerMain(command string, args ...string) error { return fmt.Errorf("no host set in %s, set one with '%s config {HOST}'", ConfigPath(), os.Args[0]) } + tls := &tls.Config{ + InsecureSkipVerify: true, + } + // Set up the server - clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), grpc.WithInsecure()) + clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), grpc.WithTransportCredentials(credentials.NewTLS(tls))) if err != nil { return err } From 71a0ef9920ac06845013d03ef24e6ceae3c3563f Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:36:34 +0100 Subject: [PATCH 43/58] Use the fullchain.pem not the cert.pem as explained by letsencrypt --- cmd/rove-server/internal/server.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/rove-server/internal/server.go b/cmd/rove-server/internal/server.go index 4969687..e2b7e16 100644 --- a/cmd/rove-server/internal/server.go +++ b/cmd/rove-server/internal/server.go @@ -113,7 +113,7 @@ func (s *Server) Initialise(fillWorld bool) (err error) { // Load TLS var opts []grpc.ServerOption if len(os.Getenv("NO_TLS")) == 0 { - pem := path.Join("/etc/letsencrypt/live/", cert, "cert.pem") + pem := path.Join("/etc/letsencrypt/live/", cert, "fullchain.pem") key := path.Join("/etc/letsencrypt/live/", cert, "privkey.pem") creds, err := credentials.NewServerTLSFromFile(pem, key) if err != nil { From cf1dff2814586b04855230735552e81d3e0727f9 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:41:52 +0100 Subject: [PATCH 44/58] Make sure the client verifies the TLS --- cmd/rove/main.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 99a1f77..4ea6a45 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -187,9 +187,7 @@ func InnerMain(command string, args ...string) error { return fmt.Errorf("no host set in %s, set one with '%s config {HOST}'", ConfigPath(), os.Args[0]) } - tls := &tls.Config{ - InsecureSkipVerify: true, - } + tls := &tls.Config{} // Set up the server clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), grpc.WithTransportCredentials(credentials.NewTLS(tls))) From 4f2a7edeb1828bdbd6ac8aed00d214b640022cca Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:42:23 +0100 Subject: [PATCH 45/58] Skip local tests, removing duplicate test runs --- Makefile | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/Makefile b/Makefile index be0edcb..3aedd83 100644 --- a/Makefile +++ b/Makefile @@ -18,10 +18,7 @@ gen: protoc --proto_path proto --go_out=plugins=grpc,paths=source_relative:proto/ proto/roveapi/roveapi.proto test: - @echo Unit tests - go test -v ./... - - @echo Integration tests + @echo Run unit and integration tests docker-compose -f docker-compose-test.yml up --build --exit-code-from=rove-tests --abort-on-container-exit rove-tests docker-compose -f docker-compose-test.yml down go tool cover -html=/tmp/coverage-data/c.out -o /tmp/coverage.html From 500e0f9557571f96a6b8b45e7ad971e47c574f23 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:46:42 +0100 Subject: [PATCH 46/58] Skip the tls verify on the client side for now --- cmd/rove/main.go | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 4ea6a45..99a1f77 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -187,7 +187,9 @@ func InnerMain(command string, args ...string) error { return fmt.Errorf("no host set in %s, set one with '%s config {HOST}'", ConfigPath(), os.Args[0]) } - tls := &tls.Config{} + tls := &tls.Config{ + InsecureSkipVerify: true, + } // Set up the server clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), grpc.WithTransportCredentials(credentials.NewTLS(tls))) From 94767f06d3c4c7e4c4f2dd23e4b1da9165ba2f74 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 26 Jul 2020 23:53:29 +0100 Subject: [PATCH 47/58] Fix to disable TLS in tests --- cmd/rove/main.go | 9 ++++++--- cmd/rove/main_test.go | 1 + 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 99a1f77..06999d3 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -187,12 +187,15 @@ func InnerMain(command string, args ...string) error { return fmt.Errorf("no host set in %s, set one with '%s config {HOST}'", ConfigPath(), os.Args[0]) } - tls := &tls.Config{ - InsecureSkipVerify: true, + var opts []grpc.DialOption + if len(os.Getenv("NO_TLS")) == 0 { + opts = append(opts, grpc.WithTransportCredentials(credentials.NewTLS(&tls.Config{}))) + } else { + opts = append(opts, grpc.WithInsecure()) } // Set up the server - clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), grpc.WithTransportCredentials(credentials.NewTLS(tls))) + clientConn, err := grpc.Dial(fmt.Sprintf("%s:%d", config.Host, gRPCport), opts...) if err != nil { return err } diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index d0e12d6..25e08ae 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -13,6 +13,7 @@ import ( ) func Test_InnerMain(t *testing.T) { + os.Setenv("NO_TLS", "1") // Use temporary local user data tmp, err := ioutil.TempDir(os.TempDir(), "rove-") From 70f041ae5d16686b65ffb77c9528b216d19c4310 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 1 Aug 2020 11:09:15 +0100 Subject: [PATCH 48/58] Spawn rover parts in the world --- pkg/rove/worldgen.go | 16 +++++++++++++--- 1 file changed, 13 insertions(+), 3 deletions(-) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index dd864b8..a1593c6 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -35,6 +35,7 @@ func NewNoiseWorldGen(seed int64) WorldGen { const ( terrainNoiseScale = 15 rockNoiseScale = 3 + partsNoiseScale = 2 ) // GetTile returns the chosen tile at a location @@ -52,12 +53,21 @@ func (g *NoiseWorldGen) GetTile(v maths.Vector) roveapi.Tile { // GetObject returns the chosen object at a location func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { - o := g.noise.Eval2(float64(v.X)/rockNoiseScale, float64(v.Y)/rockNoiseScale) + r := g.noise.Eval2(float64(v.X)/rockNoiseScale, float64(v.Y)/rockNoiseScale) switch { - case o > 0.6: + // Prioritise rocks + case r > 0.6: obj.Type = roveapi.Object_RockLarge - case o > 0.5: + case r > 0.5: obj.Type = roveapi.Object_RockSmall + + default: + // Otherwise, try some rover parts + p := g.noise.Eval2(float64(v.X)/partsNoiseScale, float64(v.Y)/partsNoiseScale) + switch { + case p > 0.8: + obj.Type = roveapi.Object_RoverParts + } } // Very rarely spawn a dormant rover From e66b899e2aef8ce5299dc01b589da760a8e9e6fb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 1 Aug 2020 11:09:41 +0100 Subject: [PATCH 49/58] Increase the base rover range to 10 --- pkg/rove/rover.go | 2 +- pkg/rove/world_test.go | 9 +++++---- 2 files changed, 6 insertions(+), 5 deletions(-) diff --git a/pkg/rove/rover.go b/pkg/rove/rover.go index d0fb9cb..bebde50 100644 --- a/pkg/rove/rover.go +++ b/pkg/rove/rover.go @@ -74,7 +74,7 @@ type Rover struct { // DefaultRover returns a default rover object with default settings func DefaultRover() *Rover { return &Rover{ - Range: 4, + Range: 10, Integrity: 10, MaximumIntegrity: 10, Capacity: 10, diff --git a/pkg/rove/world_test.go b/pkg/rove/world_test.go index afc8f53..f085d89 100644 --- a/pkg/rove/world_test.go +++ b/pkg/rove/world_test.go @@ -109,15 +109,16 @@ func TestWorld_RadarFromRover(t *testing.T) { world.Atlas.SetObject(maths.Vector{X: 0, Y: 0}, Object{Type: roveapi.Object_ObjectUnknown}) assert.NoError(t, world.WarpRover(a, maths.Vector{X: 0, Y: 0}), "Failed to warp rover") + r, err := world.GetRover(a) + assert.NoError(t, err) + radar, objs, err := world.RadarFromRover(a) assert.NoError(t, err, "Failed to get radar from rover") - fullRange := 4 + 4 + 1 + fullRange := r.Range + r.Range + 1 assert.Equal(t, fullRange*fullRange, len(radar), "Radar returned wrong length") assert.Equal(t, fullRange*fullRange, len(objs), "Radar returned wrong length") - // Test the expected values - assert.Equal(t, roveapi.Object_RoverLive, objs[1+fullRange]) - assert.Equal(t, roveapi.Object_RoverLive, objs[4+4*fullRange]) + // TODO: Verify the other rover is on the radar // Check the radar results are stable radar1, objs1, err := world.RadarFromRover(a) From 018c122861f7a1536b3fe8ee754dfd1c2207a477 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 1 Aug 2020 11:24:53 +0100 Subject: [PATCH 50/58] Stop spawning dormant rovers in the world --- pkg/rove/worldgen.go | 40 ---------------------------------------- 1 file changed, 40 deletions(-) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index a1593c6..2abb447 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -1,10 +1,6 @@ package rove import ( - "encoding/json" - "log" - "math/rand" - "github.com/mdiluz/rove/pkg/maths" "github.com/mdiluz/rove/proto/roveapi" "github.com/ojrac/opensimplex-go" @@ -70,41 +66,5 @@ func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { } } - // Very rarely spawn a dormant rover - if obj.Type == roveapi.Object_ObjectUnknown { - // TODO: Make this better, ideally with noise - if v.X%25 == 0 && v.Y%25 == 0 && v.X != 0 && v.Y != 0 { - obj.Type = roveapi.Object_RoverDormant - } - } - - // Post process any spawned objects - switch obj.Type { - case roveapi.Object_RoverDormant: - // Create the rover - r := DefaultRover() - - // Set the rover variables - r.Pos = v - - // Upgrade this rover randomly - r.MaximumCharge += rand.Int() % 3 - r.MaximumIntegrity += rand.Int() % 3 - r.Capacity += rand.Int() % 3 - r.Range += rand.Int() % 3 - - // For now, mark the log as corrupted - r.AddLogEntryf("log corrupted") - - // Marshal the rover data into the object data - b, err := json.Marshal(r) - if err != nil { - log.Fatalf("couldn't marshal rover, should never fail: %s", err) - } - - // Store the bytes - obj.Data = b - } - return obj } From 636f0ed7734cc3642eac9b9bda9e807c00a91ede Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sat, 1 Aug 2020 11:26:10 +0100 Subject: [PATCH 51/58] Spawn rover parts a little more frequently --- pkg/rove/worldgen.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pkg/rove/worldgen.go b/pkg/rove/worldgen.go index 2abb447..6cb425f 100644 --- a/pkg/rove/worldgen.go +++ b/pkg/rove/worldgen.go @@ -61,7 +61,7 @@ func (g *NoiseWorldGen) GetObject(v maths.Vector) (obj Object) { // Otherwise, try some rover parts p := g.noise.Eval2(float64(v.X)/partsNoiseScale, float64(v.Y)/partsNoiseScale) switch { - case p > 0.8: + case p > 0.7: obj.Type = roveapi.Object_RoverParts } } From 6a44633d40ae92c0c66e2baecae387ec9a9762ab Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 11:28:14 +0100 Subject: [PATCH 52/58] Add rover parts to the cmdline pretty printer --- cmd/rove/internal/glyph.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/cmd/rove/internal/glyph.go b/cmd/rove/internal/glyph.go index eac12c0..4a774e7 100644 --- a/cmd/rove/internal/glyph.go +++ b/cmd/rove/internal/glyph.go @@ -25,6 +25,9 @@ const ( // GlyphRoverDormant represents a dormant rover GlyphRoverDormant = Glyph('r') + // GlyphRoverParts represents spare rover parts + GlyphRoverParts = Glyph('*') + // GlyphRockSmall is a small stashable rock GlyphRockSmall = Glyph('o') @@ -58,6 +61,8 @@ func ObjectGlyph(o roveapi.Object) Glyph { return GlyphRoverDormant case roveapi.Object_RockLarge: return GlyphRockLarge + case roveapi.Object_RoverParts: + return GlyphRoverParts } log.Fatalf("Unknown object type: %c", o) From 1200b0a2a2361e6ea26ff036367796b33c910868 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 11:39:28 +0100 Subject: [PATCH 53/58] Add "upgrade" command to use the rover parts --- proto/roveapi/roveapi.pb.go | 526 +++++++++++++++++++++--------------- proto/roveapi/roveapi.proto | 44 ++- 2 files changed, 333 insertions(+), 237 deletions(-) diff --git a/proto/roveapi/roveapi.pb.go b/proto/roveapi/roveapi.pb.go index 753c058..81a6cb5 100644 --- a/proto/roveapi/roveapi.pb.go +++ b/proto/roveapi/roveapi.pb.go @@ -39,47 +39,51 @@ type CommandType int32 const ( CommandType_none CommandType = 0 - // Toggles the sails, either catching the wind, or charging from the sun - CommandType_toggle CommandType = 1 - // Turns the rover in the specified bearing (requires bearing) - CommandType_turn CommandType = 2 - // Stashes item at current location in rover inventory - CommandType_stash CommandType = 3 - // Repairs the rover using an inventory object - CommandType_repair CommandType = 4 - // Broadcasts a message to nearby rovers (requires data) - CommandType_broadcast CommandType = 5 - // Salvages a neighboring dormant rover for parts - CommandType_salvage CommandType = 6 - // Transfers remote control into dormant rover - CommandType_transfer CommandType = 7 // Waits before performing the next command - CommandType_wait CommandType = 8 + CommandType_wait CommandType = 1 + // Toggles the sails, either catching the wind, or charging from the sun + CommandType_toggle CommandType = 2 + // Turns the rover in the specified bearing (requires bearing) + CommandType_turn CommandType = 3 + // Stashes item at current location in rover inventory + CommandType_stash CommandType = 4 + // Repairs the rover using an inventory object + CommandType_repair CommandType = 5 + // Broadcasts a message to nearby rovers (requires data) + CommandType_broadcast CommandType = 6 + // Salvages a neighboring dormant rover for parts + CommandType_salvage CommandType = 7 + // Transfers remote control into dormant rover + CommandType_transfer CommandType = 8 + // Upgrades a chosen rover specification using 5 rover parts + CommandType_upgrade CommandType = 9 ) // Enum value maps for CommandType. var ( CommandType_name = map[int32]string{ 0: "none", - 1: "toggle", - 2: "turn", - 3: "stash", - 4: "repair", - 5: "broadcast", - 6: "salvage", - 7: "transfer", - 8: "wait", + 1: "wait", + 2: "toggle", + 3: "turn", + 4: "stash", + 5: "repair", + 6: "broadcast", + 7: "salvage", + 8: "transfer", + 9: "upgrade", } CommandType_value = map[string]int32{ "none": 0, - "toggle": 1, - "turn": 2, - "stash": 3, - "repair": 4, - "broadcast": 5, - "salvage": 6, - "transfer": 7, - "wait": 8, + "wait": 1, + "toggle": 2, + "turn": 3, + "stash": 4, + "repair": 5, + "broadcast": 6, + "salvage": 7, + "transfer": 8, + "upgrade": 9, } ) @@ -179,6 +183,62 @@ func (Bearing) EnumDescriptor() ([]byte, []int) { return file_roveapi_roveapi_proto_rawDescGZIP(), []int{1} } +// Describes the type of upgrade +type RoverUpgrade int32 + +const ( + RoverUpgrade_RoverUpgradeUnknown RoverUpgrade = 0 + RoverUpgrade_Range RoverUpgrade = 1 + RoverUpgrade_Capacity RoverUpgrade = 2 + RoverUpgrade_MaximumIntegrity RoverUpgrade = 3 + RoverUpgrade_MaximumCharge RoverUpgrade = 4 +) + +// Enum value maps for RoverUpgrade. +var ( + RoverUpgrade_name = map[int32]string{ + 0: "RoverUpgradeUnknown", + 1: "Range", + 2: "Capacity", + 3: "MaximumIntegrity", + 4: "MaximumCharge", + } + RoverUpgrade_value = map[string]int32{ + "RoverUpgradeUnknown": 0, + "Range": 1, + "Capacity": 2, + "MaximumIntegrity": 3, + "MaximumCharge": 4, + } +) + +func (x RoverUpgrade) Enum() *RoverUpgrade { + p := new(RoverUpgrade) + *p = x + return p +} + +func (x RoverUpgrade) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (RoverUpgrade) Descriptor() protoreflect.EnumDescriptor { + return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() +} + +func (RoverUpgrade) Type() protoreflect.EnumType { + return &file_roveapi_roveapi_proto_enumTypes[2] +} + +func (x RoverUpgrade) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use RoverUpgrade.Descriptor instead. +func (RoverUpgrade) EnumDescriptor() ([]byte, []int) { + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} +} + // Types of objects type Object int32 @@ -229,11 +289,11 @@ func (x Object) String() string { } func (Object) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[2].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() } func (Object) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[2] + return &file_roveapi_roveapi_proto_enumTypes[3] } func (x Object) Number() protoreflect.EnumNumber { @@ -242,7 +302,7 @@ func (x Object) Number() protoreflect.EnumNumber { // Deprecated: Use Object.Descriptor instead. func (Object) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{2} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} } type Tile int32 @@ -285,11 +345,11 @@ func (x Tile) String() string { } func (Tile) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[3].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() } func (Tile) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[3] + return &file_roveapi_roveapi_proto_enumTypes[4] } func (x Tile) Number() protoreflect.EnumNumber { @@ -298,7 +358,7 @@ func (x Tile) Number() protoreflect.EnumNumber { // Deprecated: Use Tile.Descriptor instead. func (Tile) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{3} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} } // SailPosition represents the position of the sola sail @@ -337,11 +397,11 @@ func (x SailPosition) String() string { } func (SailPosition) Descriptor() protoreflect.EnumDescriptor { - return file_roveapi_roveapi_proto_enumTypes[4].Descriptor() + return file_roveapi_roveapi_proto_enumTypes[5].Descriptor() } func (SailPosition) Type() protoreflect.EnumType { - return &file_roveapi_roveapi_proto_enumTypes[4] + return &file_roveapi_roveapi_proto_enumTypes[5] } func (x SailPosition) Number() protoreflect.EnumNumber { @@ -350,7 +410,7 @@ func (x SailPosition) Number() protoreflect.EnumNumber { // Deprecated: Use SailPosition.Descriptor instead. func (SailPosition) EnumDescriptor() ([]byte, []int) { - return file_roveapi_roveapi_proto_rawDescGZIP(), []int{4} + return file_roveapi_roveapi_proto_rawDescGZIP(), []int{5} } // ServerStatusRequest is an empty placeholder @@ -648,6 +708,8 @@ type Command struct { Data []byte `protobuf:"bytes,3,opt,name=data,proto3" json:"data,omitempty"` // move - the bearing for the rover to turn to Bearing Bearing `protobuf:"varint,4,opt,name=bearing,proto3,enum=roveapi.Bearing" json:"bearing,omitempty"` + // upgrade - the upgrade to apply to the rover + Upgrade RoverUpgrade `protobuf:"varint,5,opt,name=upgrade,proto3,enum=roveapi.RoverUpgrade" json:"upgrade,omitempty"` } func (x *Command) Reset() { @@ -710,6 +772,13 @@ func (x *Command) GetBearing() Bearing { return Bearing_BearingUnknown } +func (x *Command) GetUpgrade() RoverUpgrade { + if x != nil { + return x.Upgrade + } + return RoverUpgrade_RoverUpgradeUnknown +} + // CommandRequest describes a set of commands to be requested for the rover type CommandRequest struct { state protoimpl.MessageState @@ -1423,7 +1492,7 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x91, 0x01, 0x0a, 0x07, 0x43, 0x6f, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0xc2, 0x01, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x2e, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, 0x79, 0x70, 0x65, 0x52, 0x07, 0x63, 0x6f, @@ -1432,137 +1501,148 @@ var file_roveapi_roveapi_proto_rawDesc = []byte{ 0x04, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x61, 0x74, 0x61, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x6a, 0x0a, - 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, 0x63, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, 0x6d, - 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, 0x0c, - 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, - 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x52, - 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, 0x61, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, 0x6e, - 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0d, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, 0x74, - 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, - 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, - 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x0a, + 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0x6a, + 0x0a, 0x0e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, 0x03, - 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, 0x56, - 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x01, - 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, - 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, - 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, - 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x6d, - 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, - 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, 0x61, - 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, 0x0a, - 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x61, - 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, 0x6c, - 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, 0x65, - 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, 0x76, - 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, 0x72, - 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, - 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x0e, - 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x06, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, - 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, - 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, 0x72, - 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, - 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, 0x73, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x2c, 0x0a, 0x08, + 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, + 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x11, 0x0a, 0x0f, 0x43, 0x6f, + 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x0a, + 0x0c, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, + 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x10, + 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x75, 0x0a, 0x0d, 0x52, 0x61, 0x64, + 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x72, 0x61, + 0x6e, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, + 0x12, 0x23, 0x0a, 0x05, 0x74, 0x69, 0x6c, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0e, 0x32, + 0x0d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x54, 0x69, 0x6c, 0x65, 0x52, 0x05, + 0x74, 0x69, 0x6c, 0x65, 0x73, 0x12, 0x29, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0e, 0x32, 0x0f, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, + 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x22, 0x3b, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x2a, 0x0a, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x41, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x07, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x2d, 0x0a, + 0x03, 0x4c, 0x6f, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x74, 0x65, 0x78, 0x74, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x74, 0x65, 0x78, 0x74, 0x22, 0x24, 0x0a, 0x06, + 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x0c, 0x0a, 0x01, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x01, 0x78, 0x12, 0x0c, 0x0a, 0x01, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x01, 0x79, 0x22, 0xad, 0x01, 0x0a, 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x72, 0x61, 0x6e, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x72, + 0x61, 0x6e, 0x67, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x12, 0x2a, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x69, + 0x6d, 0x75, 0x6d, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x24, 0x0a, 0x0d, + 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, + 0x67, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x0b, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, + 0x75, 0x73, 0x12, 0x2a, 0x0a, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, 0x6c, - 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, 0x65, - 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, 0x01, - 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, 0x70, - 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, 0x70, - 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, 0x64, - 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x78, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, 0x0a, 0x0a, - 0x06, 0x74, 0x6f, 0x67, 0x67, 0x6c, 0x65, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, - 0x6e, 0x10, 0x02, 0x12, 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x03, 0x12, 0x0a, - 0x0a, 0x06, 0x72, 0x65, 0x70, 0x61, 0x69, 0x72, 0x10, 0x04, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, - 0x6f, 0x61, 0x64, 0x63, 0x61, 0x73, 0x74, 0x10, 0x05, 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, - 0x76, 0x61, 0x67, 0x65, 0x10, 0x06, 0x12, 0x0c, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, - 0x65, 0x72, 0x10, 0x07, 0x12, 0x08, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x10, 0x08, 0x2a, 0x83, - 0x01, 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, - 0x61, 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, - 0x0a, 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, - 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, - 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, - 0x04, 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, - 0x53, 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, - 0x65, 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, - 0x73, 0x74, 0x10, 0x08, 0x2a, 0x6a, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, - 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, - 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, - 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, - 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, - 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, - 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, - 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, - 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, - 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, - 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, - 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, - 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, - 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, - 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, - 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, - 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, - 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, - 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, - 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, - 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, - 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, - 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, - 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, - 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x07, 0x62, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x39, + 0x0a, 0x0c, 0x73, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, + 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x73, 0x61, 0x69, + 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x76, + 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x69, 0x6e, + 0x76, 0x65, 0x6e, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x74, 0x65, 0x67, + 0x72, 0x69, 0x74, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x69, 0x6e, 0x74, 0x65, + 0x67, 0x72, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x63, 0x68, 0x61, 0x72, 0x67, 0x65, 0x12, 0x38, 0x0a, + 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x18, + 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x0e, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x43, + 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x73, 0x22, 0x84, 0x01, 0x0a, 0x0d, 0x52, 0x6f, 0x76, 0x65, + 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2b, 0x0a, 0x08, 0x70, 0x6f, 0x73, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x72, 0x6f, + 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x56, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x52, 0x08, 0x70, 0x6f, + 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x0a, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x42, + 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x52, 0x04, 0x77, 0x69, 0x6e, 0x64, 0x12, 0x20, 0x0a, 0x04, + 0x6c, 0x6f, 0x67, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x4c, 0x6f, 0x67, 0x52, 0x04, 0x6c, 0x6f, 0x67, 0x73, 0x22, 0xa4, + 0x01, 0x0a, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x30, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x53, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x12, 0x2c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x32, 0x0a, 0x08, 0x72, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x52, 0x65, 0x61, 0x64, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x72, 0x65, 0x61, + 0x64, 0x69, 0x6e, 0x67, 0x73, 0x2a, 0x85, 0x01, 0x0a, 0x0b, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, + 0x64, 0x54, 0x79, 0x70, 0x65, 0x12, 0x08, 0x0a, 0x04, 0x6e, 0x6f, 0x6e, 0x65, 0x10, 0x00, 0x12, + 0x08, 0x0a, 0x04, 0x77, 0x61, 0x69, 0x74, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x74, 0x6f, 0x67, + 0x67, 0x6c, 0x65, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x74, 0x75, 0x72, 0x6e, 0x10, 0x03, 0x12, + 0x09, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x73, 0x68, 0x10, 0x04, 0x12, 0x0a, 0x0a, 0x06, 0x72, 0x65, + 0x70, 0x61, 0x69, 0x72, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x62, 0x72, 0x6f, 0x61, 0x64, 0x63, + 0x61, 0x73, 0x74, 0x10, 0x06, 0x12, 0x0b, 0x0a, 0x07, 0x73, 0x61, 0x6c, 0x76, 0x61, 0x67, 0x65, + 0x10, 0x07, 0x12, 0x0c, 0x0a, 0x08, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x10, 0x08, + 0x12, 0x0b, 0x0a, 0x07, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x10, 0x09, 0x2a, 0x83, 0x01, + 0x0a, 0x07, 0x42, 0x65, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x12, 0x0a, 0x0e, 0x42, 0x65, 0x61, + 0x72, 0x69, 0x6e, 0x67, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, + 0x05, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, + 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x45, 0x61, 0x73, 0x74, 0x10, + 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x45, 0x61, 0x73, 0x74, 0x10, 0x04, + 0x12, 0x09, 0x0a, 0x05, 0x53, 0x6f, 0x75, 0x74, 0x68, 0x10, 0x05, 0x12, 0x0d, 0x0a, 0x09, 0x53, + 0x6f, 0x75, 0x74, 0x68, 0x57, 0x65, 0x73, 0x74, 0x10, 0x06, 0x12, 0x08, 0x0a, 0x04, 0x57, 0x65, + 0x73, 0x74, 0x10, 0x07, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x6f, 0x72, 0x74, 0x68, 0x57, 0x65, 0x73, + 0x74, 0x10, 0x08, 0x2a, 0x69, 0x0a, 0x0c, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x52, 0x6f, 0x76, 0x65, 0x72, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x09, 0x0a, 0x05, + 0x52, 0x61, 0x6e, 0x67, 0x65, 0x10, 0x01, 0x12, 0x0c, 0x0a, 0x08, 0x43, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x4d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, + 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x69, 0x74, 0x79, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x4d, + 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x68, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x2a, 0x6a, + 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x11, 0x0a, 0x0d, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x52, + 0x6f, 0x76, 0x65, 0x72, 0x4c, 0x69, 0x76, 0x65, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x44, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x74, 0x10, 0x02, 0x12, 0x0d, 0x0a, 0x09, + 0x52, 0x6f, 0x63, 0x6b, 0x53, 0x6d, 0x61, 0x6c, 0x6c, 0x10, 0x03, 0x12, 0x0d, 0x0a, 0x09, 0x52, + 0x6f, 0x63, 0x6b, 0x4c, 0x61, 0x72, 0x67, 0x65, 0x10, 0x04, 0x12, 0x0e, 0x0a, 0x0a, 0x52, 0x6f, + 0x76, 0x65, 0x72, 0x50, 0x61, 0x72, 0x74, 0x73, 0x10, 0x05, 0x2a, 0x37, 0x0a, 0x04, 0x54, 0x69, + 0x6c, 0x65, 0x12, 0x0f, 0x0a, 0x0b, 0x54, 0x69, 0x6c, 0x65, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, + 0x6e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x52, 0x6f, 0x63, 0x6b, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x47, 0x72, 0x61, 0x76, 0x65, 0x6c, 0x10, 0x02, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x61, 0x6e, + 0x64, 0x10, 0x03, 0x2a, 0x4c, 0x0a, 0x0c, 0x53, 0x61, 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x55, 0x6e, 0x6b, 0x6e, 0x6f, 0x77, 0x6e, 0x53, 0x61, + 0x69, 0x6c, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, + 0x43, 0x61, 0x74, 0x63, 0x68, 0x69, 0x6e, 0x67, 0x57, 0x69, 0x6e, 0x64, 0x10, 0x01, 0x12, 0x11, + 0x0a, 0x0d, 0x53, 0x6f, 0x6c, 0x61, 0x72, 0x43, 0x68, 0x61, 0x72, 0x67, 0x69, 0x6e, 0x67, 0x10, + 0x02, 0x32, 0xcf, 0x02, 0x0a, 0x04, 0x52, 0x6f, 0x76, 0x65, 0x12, 0x4d, 0x0a, 0x0c, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x76, + 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x41, 0x0a, 0x08, 0x52, 0x65, 0x67, + 0x69, 0x73, 0x74, 0x65, 0x72, 0x12, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x19, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3e, 0x0a, 0x07, + 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x12, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, + 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x43, 0x6f, 0x6d, 0x6d, 0x61, + 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x38, 0x0a, 0x05, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x12, 0x15, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, + 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x72, + 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x52, 0x61, 0x64, 0x61, 0x72, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x3b, 0x0a, 0x06, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x16, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x72, 0x6f, 0x76, 0x65, 0x61, + 0x70, 0x69, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x00, 0x42, 0x26, 0x5a, 0x24, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x6d, 0x64, 0x69, 0x6c, 0x75, 0x7a, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x72, 0x6f, 0x76, 0x65, 0x61, 0x70, 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -1577,66 +1657,68 @@ func file_roveapi_roveapi_proto_rawDescGZIP() []byte { return file_roveapi_roveapi_proto_rawDescData } -var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 5) +var file_roveapi_roveapi_proto_enumTypes = make([]protoimpl.EnumInfo, 6) var file_roveapi_roveapi_proto_msgTypes = make([]protoimpl.MessageInfo, 17) var file_roveapi_roveapi_proto_goTypes = []interface{}{ (CommandType)(0), // 0: roveapi.CommandType (Bearing)(0), // 1: roveapi.Bearing - (Object)(0), // 2: roveapi.Object - (Tile)(0), // 3: roveapi.Tile - (SailPosition)(0), // 4: roveapi.SailPosition - (*ServerStatusRequest)(nil), // 5: roveapi.ServerStatusRequest - (*ServerStatusResponse)(nil), // 6: roveapi.ServerStatusResponse - (*RegisterRequest)(nil), // 7: roveapi.RegisterRequest - (*Account)(nil), // 8: roveapi.Account - (*RegisterResponse)(nil), // 9: roveapi.RegisterResponse - (*Command)(nil), // 10: roveapi.Command - (*CommandRequest)(nil), // 11: roveapi.CommandRequest - (*CommandResponse)(nil), // 12: roveapi.CommandResponse - (*RadarRequest)(nil), // 13: roveapi.RadarRequest - (*RadarResponse)(nil), // 14: roveapi.RadarResponse - (*StatusRequest)(nil), // 15: roveapi.StatusRequest - (*Log)(nil), // 16: roveapi.Log - (*Vector)(nil), // 17: roveapi.Vector - (*RoverSpecifications)(nil), // 18: roveapi.RoverSpecifications - (*RoverStatus)(nil), // 19: roveapi.RoverStatus - (*RoverReadings)(nil), // 20: roveapi.RoverReadings - (*StatusResponse)(nil), // 21: roveapi.StatusResponse + (RoverUpgrade)(0), // 2: roveapi.RoverUpgrade + (Object)(0), // 3: roveapi.Object + (Tile)(0), // 4: roveapi.Tile + (SailPosition)(0), // 5: roveapi.SailPosition + (*ServerStatusRequest)(nil), // 6: roveapi.ServerStatusRequest + (*ServerStatusResponse)(nil), // 7: roveapi.ServerStatusResponse + (*RegisterRequest)(nil), // 8: roveapi.RegisterRequest + (*Account)(nil), // 9: roveapi.Account + (*RegisterResponse)(nil), // 10: roveapi.RegisterResponse + (*Command)(nil), // 11: roveapi.Command + (*CommandRequest)(nil), // 12: roveapi.CommandRequest + (*CommandResponse)(nil), // 13: roveapi.CommandResponse + (*RadarRequest)(nil), // 14: roveapi.RadarRequest + (*RadarResponse)(nil), // 15: roveapi.RadarResponse + (*StatusRequest)(nil), // 16: roveapi.StatusRequest + (*Log)(nil), // 17: roveapi.Log + (*Vector)(nil), // 18: roveapi.Vector + (*RoverSpecifications)(nil), // 19: roveapi.RoverSpecifications + (*RoverStatus)(nil), // 20: roveapi.RoverStatus + (*RoverReadings)(nil), // 21: roveapi.RoverReadings + (*StatusResponse)(nil), // 22: roveapi.StatusResponse } var file_roveapi_roveapi_proto_depIdxs = []int32{ - 8, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account + 9, // 0: roveapi.RegisterResponse.account:type_name -> roveapi.Account 0, // 1: roveapi.Command.command:type_name -> roveapi.CommandType 1, // 2: roveapi.Command.bearing:type_name -> roveapi.Bearing - 8, // 3: roveapi.CommandRequest.account:type_name -> roveapi.Account - 10, // 4: roveapi.CommandRequest.commands:type_name -> roveapi.Command - 8, // 5: roveapi.RadarRequest.account:type_name -> roveapi.Account - 3, // 6: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile - 2, // 7: roveapi.RadarResponse.objects:type_name -> roveapi.Object - 8, // 8: roveapi.StatusRequest.account:type_name -> roveapi.Account - 1, // 9: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing - 4, // 10: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition - 10, // 11: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command - 17, // 12: roveapi.RoverReadings.position:type_name -> roveapi.Vector - 1, // 13: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing - 16, // 14: roveapi.RoverReadings.logs:type_name -> roveapi.Log - 18, // 15: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications - 19, // 16: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus - 20, // 17: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings - 5, // 18: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest - 7, // 19: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest - 11, // 20: roveapi.Rove.Command:input_type -> roveapi.CommandRequest - 13, // 21: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest - 15, // 22: roveapi.Rove.Status:input_type -> roveapi.StatusRequest - 6, // 23: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse - 9, // 24: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse - 12, // 25: roveapi.Rove.Command:output_type -> roveapi.CommandResponse - 14, // 26: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse - 21, // 27: roveapi.Rove.Status:output_type -> roveapi.StatusResponse - 23, // [23:28] is the sub-list for method output_type - 18, // [18:23] is the sub-list for method input_type - 18, // [18:18] is the sub-list for extension type_name - 18, // [18:18] is the sub-list for extension extendee - 0, // [0:18] is the sub-list for field type_name + 2, // 3: roveapi.Command.upgrade:type_name -> roveapi.RoverUpgrade + 9, // 4: roveapi.CommandRequest.account:type_name -> roveapi.Account + 11, // 5: roveapi.CommandRequest.commands:type_name -> roveapi.Command + 9, // 6: roveapi.RadarRequest.account:type_name -> roveapi.Account + 4, // 7: roveapi.RadarResponse.tiles:type_name -> roveapi.Tile + 3, // 8: roveapi.RadarResponse.objects:type_name -> roveapi.Object + 9, // 9: roveapi.StatusRequest.account:type_name -> roveapi.Account + 1, // 10: roveapi.RoverStatus.bearing:type_name -> roveapi.Bearing + 5, // 11: roveapi.RoverStatus.sailPosition:type_name -> roveapi.SailPosition + 11, // 12: roveapi.RoverStatus.queuedCommands:type_name -> roveapi.Command + 18, // 13: roveapi.RoverReadings.position:type_name -> roveapi.Vector + 1, // 14: roveapi.RoverReadings.wind:type_name -> roveapi.Bearing + 17, // 15: roveapi.RoverReadings.logs:type_name -> roveapi.Log + 19, // 16: roveapi.StatusResponse.spec:type_name -> roveapi.RoverSpecifications + 20, // 17: roveapi.StatusResponse.status:type_name -> roveapi.RoverStatus + 21, // 18: roveapi.StatusResponse.readings:type_name -> roveapi.RoverReadings + 6, // 19: roveapi.Rove.ServerStatus:input_type -> roveapi.ServerStatusRequest + 8, // 20: roveapi.Rove.Register:input_type -> roveapi.RegisterRequest + 12, // 21: roveapi.Rove.Command:input_type -> roveapi.CommandRequest + 14, // 22: roveapi.Rove.Radar:input_type -> roveapi.RadarRequest + 16, // 23: roveapi.Rove.Status:input_type -> roveapi.StatusRequest + 7, // 24: roveapi.Rove.ServerStatus:output_type -> roveapi.ServerStatusResponse + 10, // 25: roveapi.Rove.Register:output_type -> roveapi.RegisterResponse + 13, // 26: roveapi.Rove.Command:output_type -> roveapi.CommandResponse + 15, // 27: roveapi.Rove.Radar:output_type -> roveapi.RadarResponse + 22, // 28: roveapi.Rove.Status:output_type -> roveapi.StatusResponse + 24, // [24:29] is the sub-list for method output_type + 19, // [19:24] is the sub-list for method input_type + 19, // [19:19] is the sub-list for extension type_name + 19, // [19:19] is the sub-list for extension extendee + 0, // [0:19] is the sub-list for field type_name } func init() { file_roveapi_roveapi_proto_init() } @@ -1855,7 +1937,7 @@ func file_roveapi_roveapi_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_roveapi_roveapi_proto_rawDesc, - NumEnums: 5, + NumEnums: 6, NumMessages: 17, NumExtensions: 0, NumServices: 1, diff --git a/proto/roveapi/roveapi.proto b/proto/roveapi/roveapi.proto index 9aad682..72a1fc2 100644 --- a/proto/roveapi/roveapi.proto +++ b/proto/roveapi/roveapi.proto @@ -89,22 +89,24 @@ message RegisterResponse { // CommandType defines the type of a command to give to the rover enum CommandType { none = 0; - // Toggles the sails, either catching the wind, or charging from the sun - toggle = 1; - // Turns the rover in the specified bearing (requires bearing) - turn = 2; - // Stashes item at current location in rover inventory - stash = 3; - // Repairs the rover using an inventory object - repair = 4; - // Broadcasts a message to nearby rovers (requires data) - broadcast = 5; - // Salvages a neighboring dormant rover for parts - salvage = 6; - // Transfers remote control into dormant rover - transfer = 7; // Waits before performing the next command - wait = 8; + wait = 1; + // Toggles the sails, either catching the wind, or charging from the sun + toggle = 2; + // Turns the rover in the specified bearing (requires bearing) + turn = 3; + // Stashes item at current location in rover inventory + stash = 4; + // Repairs the rover using an inventory object + repair = 5; + // Broadcasts a message to nearby rovers (requires data) + broadcast = 6; + // Salvages a neighboring dormant rover for parts + salvage = 7; + // Transfers remote control into dormant rover + transfer = 8; + // Upgrades a chosen rover specification using 5 rover parts + upgrade = 9; } // Bearing represents a compass direction @@ -121,6 +123,15 @@ enum Bearing { NorthWest = 8; } +// Describes the type of upgrade +enum RoverUpgrade { + RoverUpgradeUnknown = 0; + Range = 1; + Capacity = 2; + MaximumIntegrity = 3; + MaximumCharge = 4; +} + // Command is a single command for a rover message Command { // The command type @@ -135,6 +146,9 @@ message Command { // move - the bearing for the rover to turn to Bearing bearing = 4; + + // upgrade - the upgrade to apply to the rover + RoverUpgrade upgrade = 5; } // CommandRequest describes a set of commands to be requested for the rover From b114b68ff751aae8f153da53bd34804f14794d73 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 12:03:12 +0100 Subject: [PATCH 54/58] Add upgrade command code --- pkg/rove/world.go | 66 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 66 insertions(+) diff --git a/pkg/rove/world.go b/pkg/rove/world.go index d2483b5..64e3982 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -15,6 +15,9 @@ import ( const ( // ticksPerNormalMove defines the number of ticks it should take for a "normal" speed move ticksPerNormalMove = 4 + + // upgradeCost is the cost in rover parts needed to upgrade a rover specification + upgradeCost = 5 ) // CommandStream is a list of commands to execute in order @@ -446,6 +449,63 @@ func (w *World) RoverToggle(rover string) (roveapi.SailPosition, error) { return r.SailPosition, nil } +// RoverUpgrade will try to upgrade the rover +func (w *World) RoverUpgrade(rover string, upgrade roveapi.RoverUpgrade) (int, error) { + w.worldMutex.Lock() + defer w.worldMutex.Unlock() + + r, ok := w.Rovers[rover] + if !ok { + return 0, fmt.Errorf("no rover matching id") + } + + cost := upgradeCost + num := 0 + for i := range r.Inventory { + if r.Inventory[i].Type == roveapi.Object_RoverParts { + num++ + } + } + + if num < cost { + r.AddLogEntryf("tried to upgrade but lacked rover parts") + return 0, nil + } + + // Apply the upgrade + var ret int + switch upgrade { + case roveapi.RoverUpgrade_Capacity: + r.Capacity++ + ret = r.Capacity + case roveapi.RoverUpgrade_Range: + r.Range++ + ret = r.Range + case roveapi.RoverUpgrade_MaximumCharge: + r.MaximumCharge++ + ret = r.MaximumCharge + case roveapi.RoverUpgrade_MaximumIntegrity: + r.MaximumIntegrity++ + ret = r.MaximumIntegrity + default: + return 0, fmt.Errorf("unknown upgrade: %s", upgrade) + } + + // Remove the cost in rover parts + var n []Object + for _, o := range r.Inventory { + if o.Type == roveapi.Object_RoverParts && cost > 0 { + cost-- + } else { + n = append(n, o) + } + } + // Assign back the inventory + r.Inventory = n + + return ret, nil +} + // RoverTurn will turn the rover func (w *World) RoverTurn(rover string, bearing roveapi.Bearing) (roveapi.Bearing, error) { w.worldMutex.Lock() @@ -582,6 +642,10 @@ func (w *World) Enqueue(rover string, commands ...*roveapi.Command) error { if c.GetBearing() == roveapi.Bearing_BearingUnknown { return fmt.Errorf("turn command given unknown bearing") } + case roveapi.CommandType_upgrade: + if c.GetUpgrade() == roveapi.RoverUpgrade_RoverUpgradeUnknown { + return fmt.Errorf("upgrade command given unknown upgrade") + } case roveapi.CommandType_wait: case roveapi.CommandType_toggle: case roveapi.CommandType_stash: @@ -729,6 +793,8 @@ func (w *World) ExecuteCommand(c *roveapi.Command, rover string) (done bool, err _, err = w.RoverSalvage(rover) case roveapi.CommandType_transfer: _, err = w.RoverTransfer(rover) + case roveapi.CommandType_upgrade: + _, err = w.RoverUpgrade(rover, c.GetUpgrade()) case roveapi.CommandType_wait: // Nothing to do default: From 4e4af1a1beeaf042b9fad985a99f14a7fb9323eb Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 12:15:49 +0100 Subject: [PATCH 55/58] Add a test for the upgrade command --- pkg/rove/command_test.go | 55 ++++++++++++++++++++++++++++++++++++++++ pkg/rove/world.go | 2 ++ 2 files changed, 57 insertions(+) diff --git a/pkg/rove/command_test.go b/pkg/rove/command_test.go index dde7070..bf1eed6 100644 --- a/pkg/rove/command_test.go +++ b/pkg/rove/command_test.go @@ -248,3 +248,58 @@ func TestCommand_Wait(t *testing.T) { assert.NoError(t, err) assert.Equal(t, roveapi.SailPosition_CatchingWind, r.SailPosition) } + +func TestCommand_Upgrade(t *testing.T) { + w := NewWorld(8) + name, err := w.SpawnRover("") + assert.NoError(t, err) + rover, ok := w.Rovers[name] + assert.True(t, ok) + + // Try an invalid upgrade + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_upgrade}) + assert.Error(t, err) + + // Try a valid command but without the parts + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_upgrade, Upgrade: roveapi.RoverUpgrade_Capacity}) + assert.NoError(t, err) + + // Ensure nothing changed and we logged the attempt + pre := rover.Capacity + w.Tick() + assert.Equal(t, pre, rover.Capacity) + assert.Contains(t, rover.Logs[len(rover.Logs)-1].Text, "tried") + + // One non-part item + rover.Inventory = []Object{ + { + Type: roveapi.Object_RoverParts, + }, + { + Type: roveapi.Object_RoverParts, + }, + { + Type: roveapi.Object_RockSmall, + }, + { + Type: roveapi.Object_RoverParts, + }, + { + Type: roveapi.Object_RoverParts, + }, + { + Type: roveapi.Object_RoverParts, + }, + } + + // Try a valid command again + err = w.Enqueue(name, &roveapi.Command{Command: roveapi.CommandType_upgrade, Upgrade: roveapi.RoverUpgrade_Capacity}) + assert.NoError(t, err) + + // Check that the capacity increases on the tick and all the parts are used + pre = rover.Capacity + w.Tick() + assert.Equal(t, pre+1, rover.Capacity) + assert.Equal(t, 1, len(rover.Inventory)) + assert.Equal(t, roveapi.Object_RockSmall, rover.Inventory[0].Type) +} diff --git a/pkg/rove/world.go b/pkg/rove/world.go index 64e3982..d509d8d 100644 --- a/pkg/rove/world.go +++ b/pkg/rove/world.go @@ -503,6 +503,8 @@ func (w *World) RoverUpgrade(rover string, upgrade roveapi.RoverUpgrade) (int, e // Assign back the inventory r.Inventory = n + r.AddLogEntryf("upgraded %s to %d", upgrade, ret) + return ret, nil } From 804f82dd2015121222d758bbcb74d41a14d0ae4e Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 12:43:44 +0100 Subject: [PATCH 56/58] Fix up commandline interface for repeat commands to go after the command --- cmd/rove/main.go | 56 ++++++++++++++++++++----------------------- cmd/rove/main_test.go | 4 ++-- 2 files changed, 28 insertions(+), 32 deletions(-) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 06999d3..551cda1 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -35,7 +35,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tregister NAME registers an account and spawns a rover") fmt.Fprintln(os.Stderr, "\tradar prints radar data in ASCII form") fmt.Fprintln(os.Stderr, "\tstatus gets rover status") - fmt.Fprintln(os.Stderr, "\tcommand [REPEAT] CMD [VAL...] queues commands, accepts multiple in sequence for command values see below") + fmt.Fprintln(os.Stderr, "\tcommand CMD [VAL...] [REPEAT] sets the command queue, accepts multiple in sequence") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Rover commands:") fmt.Fprintln(os.Stderr, "\ttoggle toggles the current sail mode") @@ -247,16 +247,8 @@ func InnerMain(command string, args ...string) error { // Iterate through each command var commands []*roveapi.Command for i := 0; i < len(args); i++ { - number := 0 - num, err := strconv.Atoi(args[i]) - if err == nil { - number = num - i++ - if i >= len(args) { - return fmt.Errorf("must pass command after repeat number") - } - } + var cmd *roveapi.Command switch args[i] { case "turn": i++ @@ -267,13 +259,10 @@ func InnerMain(command string, args ...string) error { if b == roveapi.Bearing_BearingUnknown { return fmt.Errorf("turn command must be given a valid bearing %s", args[i]) } - commands = append(commands, - &roveapi.Command{ - Command: roveapi.CommandType_turn, - Bearing: b, - Repeat: int32(number), - }, - ) + cmd = &roveapi.Command{ + Command: roveapi.CommandType_turn, + Bearing: b, + } case "broadcast": i++ if len(args) == i { @@ -281,22 +270,29 @@ func InnerMain(command string, args ...string) error { } else if len(args[i]) > 3 { return fmt.Errorf("broadcast command must be given ASCII triplet of 3 or less: %s", args[i]) } - commands = append(commands, - &roveapi.Command{ - Command: roveapi.CommandType_broadcast, - Data: []byte(args[i]), - Repeat: int32(number), - }, - ) + cmd = &roveapi.Command{ + Command: roveapi.CommandType_broadcast, + Data: []byte(args[i]), + } default: // By default just use the command literally - commands = append(commands, - &roveapi.Command{ - Command: roveapi.CommandType(roveapi.CommandType_value[args[i]]), - Repeat: int32(number), - }, - ) + cmd = &roveapi.Command{ + Command: roveapi.CommandType(roveapi.CommandType_value[args[i]]), + } } + + // Try and convert the next command to a number + number := 0 + if len(args) > i+1 { + num, err := strconv.Atoi(args[i+1]) + if err == nil { + number = num + i++ + } + } + cmd.Repeat = int32(number) + + commands = append(commands, cmd) } _, err := client.Command(ctx, &roveapi.CommandRequest{ diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index 25e08ae..ca83947 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -55,8 +55,8 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("command", "stash")) assert.NoError(t, InnerMain("command", "repair")) assert.NoError(t, InnerMain("command", "broadcast", "abc")) - assert.NoError(t, InnerMain("command", "10", "wait")) - assert.NoError(t, InnerMain("command", "1", "wait", "turn", "NW", "toggle", "broadcast", "zyx")) + assert.NoError(t, InnerMain("command", "wait", "10")) + assert.NoError(t, InnerMain("command", "wait", "1", "turn", "NW", "toggle", "broadcast", "zyx")) // Give it malformed commands assert.Error(t, InnerMain("command", "unknown")) From 35b25dde9880436fe4a2394fc2bdf47e5733f271 Mon Sep 17 00:00:00 2001 From: Marc Di Luzio Date: Sun, 2 Aug 2020 12:49:15 +0100 Subject: [PATCH 57/58] Add the upgrade command to the cmdline client --- cmd/rove/main.go | 23 +++++++++++++++++++++++ cmd/rove/main_test.go | 2 ++ 2 files changed, 25 insertions(+) diff --git a/cmd/rove/main.go b/cmd/rove/main.go index 551cda1..f1e993d 100644 --- a/cmd/rove/main.go +++ b/cmd/rove/main.go @@ -44,6 +44,7 @@ func printUsage() { fmt.Fprintln(os.Stderr, "\tbroadcast MSG broadcast a simple ASCII triplet to nearby rovers") fmt.Fprintln(os.Stderr, "\tsalvage salvages a dormant rover for parts") fmt.Fprintln(os.Stderr, "\ttransfer transfer's control into a dormant rover") + fmt.Fprintln(os.Stderr, "\tupgrade SPEC spends rover parts to upgrade one rover spec (capacity, range, integrity, charge") fmt.Fprintln(os.Stderr, "\twait waits before performing the next command") fmt.Fprintf(os.Stderr, "\n") fmt.Fprintln(os.Stderr, "Environment") @@ -274,6 +275,28 @@ func InnerMain(command string, args ...string) error { Command: roveapi.CommandType_broadcast, Data: []byte(args[i]), } + case "upgrade": + i++ + if len(args) == i { + return fmt.Errorf("upgrade command must be passed a spec to upgrade") + } + var u roveapi.RoverUpgrade + switch args[i] { + case "capacity": + u = roveapi.RoverUpgrade_Capacity + case "range": + u = roveapi.RoverUpgrade_Range + case "integrity": + u = roveapi.RoverUpgrade_MaximumIntegrity + case "charge": + u = roveapi.RoverUpgrade_MaximumCharge + default: + return fmt.Errorf("upgrade command must be passed a known upgrade spec") + } + cmd = &roveapi.Command{ + Command: roveapi.CommandType_upgrade, + Upgrade: u, + } default: // By default just use the command literally cmd = &roveapi.Command{ diff --git a/cmd/rove/main_test.go b/cmd/rove/main_test.go index ca83947..250988a 100644 --- a/cmd/rove/main_test.go +++ b/cmd/rove/main_test.go @@ -54,6 +54,7 @@ func Test_InnerMain(t *testing.T) { assert.NoError(t, InnerMain("command", "toggle")) assert.NoError(t, InnerMain("command", "stash")) assert.NoError(t, InnerMain("command", "repair")) + assert.NoError(t, InnerMain("command", "upgrade", "capacity")) assert.NoError(t, InnerMain("command", "broadcast", "abc")) assert.NoError(t, InnerMain("command", "wait", "10")) assert.NoError(t, InnerMain("command", "wait", "1", "turn", "NW", "toggle", "broadcast", "zyx")) @@ -61,5 +62,6 @@ func Test_InnerMain(t *testing.T) { // Give it malformed commands assert.Error(t, InnerMain("command", "unknown")) assert.Error(t, InnerMain("command", "broadcast")) + assert.Error(t, InnerMain("command", "upgrade")) assert.Error(t, InnerMain("command", "1")) } From f29b189a4252986a5a0a2b820f96219828e46db3 Mon Sep 17 00:00:00 2001 From: mdiluz Date: Fri, 27 Sep 2024 10:43:28 +0100 Subject: [PATCH 58/58] Update README.md --- README.md | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 2aff518..aad1a6f 100644 --- a/README.md +++ b/README.md @@ -1,9 +1,8 @@ Rove ==== -![Tests](https://github.com/mdiluz/rove/workflows/Tests/badge.svg) ![Docker](https://github.com/mdiluz/rove/workflows/Docker/badge.svg) [![rove](https://snapcraft.io//rove/badge.svg)](https://snapcraft.io/rove) -![Rove](https://github.com/mdiluz/rove/blob/master/data/icon.svg) +![Rove](data/icon.svg) Rove is an asynchronous nomadic game about exploring as part of a loose community. -This repository contains the source code for the `rove-server` deployment and the `rove` command line client. See [mdiluz.github.io/rove](https://mdiluz.github.io/rove/) for game details, and [roveapi.proto](https://github.com/mdiluz/rove/blob/master/proto/roveapi/roveapi.proto) for the current server-client API. +This repository contains the source code for the `rove-server` deployment and the `rove` command line client. See [mdiluz.github.io/rove](https://mdiluz.github.io/rove/) for game details, and [roveapi.proto](proto/roveapi/roveapi.proto) for the current server-client API.