diff --git a/battle_srv/models/room.go b/battle_srv/models/room.go index 0c535d7..8ab649f 100644 --- a/battle_srv/models/room.go +++ b/battle_srv/models/room.go @@ -62,6 +62,13 @@ const ( MAGIC_LAST_SENT_INPUT_FRAME_ID_READDED = -2 ) +const ( + ATK_CHARACTER_STATE_IDLE1 = 0 + ATK_CHARACTER_STATE_WALKING = 1 + ATK_CHARACTER_STATE_ATK1 = 2 + ATK_CHARACTER_STATE_ATKED1 = 3 +) + // These directions are chosen such that when speed is changed to "(speedX+delta, speedY+delta)" for any of them, the direction is unchanged. var DIRECTION_DECODER = [][]int32{ {0, 0}, @@ -166,7 +173,8 @@ type Room struct { LastRenderFrameIdTriggeredAt int64 PlayerDefaultSpeed int32 - BattleColliderInfo // Compositing to send centralized magic numbers + BulletBattleLocalIdCounter int32 + BattleColliderInfo // Compositing to send centralized magic numbers } func (pR *Room) updateScore() { @@ -353,6 +361,7 @@ func (pR *Room) InputsBufferString(allDetails bool) string { break } f := tmp.(*InputFrameDownsync) + //s = append(s, fmt.Sprintf("{inputFrameId: %v, inputList: %v, &inputList: %p, confirmedList: %v}", f.InputFrameId, f.InputList, &(f.InputList), f.ConfirmedList)) s = append(s, fmt.Sprintf("{inputFrameId: %v, inputList: %v, confirmedList: %v}", f.InputFrameId, f.InputList, f.ConfirmedList)) } @@ -618,7 +627,6 @@ func (pR *Room) OnBattleCmdReceived(pReq *WsReq) { Logger.Debug(fmt.Sprintf("Omitting obsolete inputFrameUpsync: roomId=%v, playerId=%v, clientInputFrameId=%v, InputsBuffer=%v", pR.Id, playerId, clientInputFrameId, pR.InputsBufferString(false))) continue } - bufIndex := pR.toDiscreteInputsBufferIndex(clientInputFrameId, pReq.JoinIndex) pR.DiscreteInputsBuffer.Store(bufIndex, inputFrameUpsync) @@ -763,6 +771,7 @@ func (pR *Room) Dismiss() { func (pR *Room) OnDismissed() { // Always instantiates new HeapRAM blocks and let the old blocks die out due to not being retained by any root reference. + pR.BulletBattleLocalIdCounter = 0 pR.WorldToVirtualGridRatio = float64(1000) pR.VirtualGridToWorldRatio = float64(1.0) / pR.WorldToVirtualGridRatio // this is a one-off computation, should avoid division in iterations pR.SpAtkLookupFrames = 5 @@ -774,7 +783,7 @@ func (pR *Room) OnDismissed() { pR.PlayerSignalToCloseDict = make(map[int32]SignalToCloseConnCbType) pR.JoinIndexBooleanArr = make([]bool, pR.Capacity) pR.Barriers = make(map[int32]*Barrier) - pR.RenderCacheSize = 256 + pR.RenderCacheSize = 512 pR.RenderFrameBuffer = NewRingBuffer(pR.RenderCacheSize) pR.DiscreteInputsBuffer = sync.Map{} pR.InputsBuffer = NewRingBuffer((pR.RenderCacheSize >> 2) + 1) @@ -797,6 +806,34 @@ func (pR *Room) OnDismissed() { pR.MaxChasingRenderFramesPerUpdate = 8 pR.BackendDynamicsEnabled = true // [WARNING] When "false", recovery upon reconnection wouldn't work! + punchSkillId := int32(1) + if _, existent := pR.MeleeSkillConfig[punchSkillId]; !existent { + pR.MeleeSkillConfig = make(map[int32]*MeleeBullet, 0) + pR.MeleeSkillConfig[punchSkillId] = &MeleeBullet{ + // for offender + StartupFrames: int32(18), + ActiveFrames: int32(42), + RecoveryFrames: int32(61), // usually but not always "startupFrames+activeFrames", I hereby set it to be 1 frame more than the actual animation to avoid critical transition, i.e. when the animation is 1 frame from ending but "rdfPlayer.framesToRecover" is already counted 0 and the player triggers an other same attack, making an effective bullet trigger but no animation is played due to same animName is still playing + RecoveryFramesOnBlock: int32(61), + RecoveryFramesOnHit: int32(61), + Moveforward: &Vec2D{ + X: 0, + Y: 0, + }, + HitboxOffset: float64(12.0), // should be about the radius of the PlayerCollider + HitboxSize: &Vec2D{ + X: float64(45.0), + Y: float64(32.0), + }, + + // for defender + HitStunFrames: int32(18), + BlockStunFrames: int32(9), + Pushback: float64(22.0), + ReleaseTriggerType: int32(1), // 1: rising-edge, 2: falling-edge + Damage: int32(5), + } + } pR.ChooseStage() pR.EffectivePlayerCount = 0 @@ -1039,7 +1076,10 @@ func (pR *Room) prefabInputFrameDownsync(inputFrameId int32) *InputFrameDownsync panic(fmt.Sprintf("Error prefabbing inputFrameDownsync: roomId=%v, InputsBuffer=%v", pR.Id, pR.InputsBufferString(false))) } prevInputFrameDownsync := tmp.(*InputFrameDownsync) - currInputList := prevInputFrameDownsync.InputList // Would be a clone of the values + currInputList := make([]uint64, pR.Capacity) // Would be a clone of the values + for i, _ := range currInputList { + currInputList[i] = (prevInputFrameDownsync.InputList[i] & uint64(15)) // Don't predict attack input + } currInputFrameDownsync = &InputFrameDownsync{ InputFrameId: inputFrameId, InputList: currInputList, @@ -1216,38 +1256,52 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF if 0 > offender.DirX { xfac = float64(-1.0) } - offenderWx, offenderWy := PolygonColliderAnchorToWorldPos(offenderCollider.X, offenderCollider.Y, offender.ColliderRadius, offender.ColliderRadius, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY) - bulletWx, bulletWy := offenderWx+xfac*meleeBullet.HitboxOffset, offenderWy+yfac*meleeBullet.HitboxOffset + bulletCx, bulletCy := offenderCollider.X+xfac*meleeBullet.HitboxOffset, offenderCollider.Y+yfac*meleeBullet.HitboxOffset - newBulletCollider := GenerateRectCollider(bulletWx, bulletWy, xfac*meleeBullet.HitboxSize.X, meleeBullet.HitboxSize.Y, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, "MeleeBullet") - // newBulletCollider.collisionBulletIndex = collisionBulletIndex - // newBulletCollider.offenderPlayerId = meleeBullet.offenderPlayerId - // newBulletCollider.pushback = meleeBullet.pushback - // newBulletCollider.hitStunFrames = meleeBullet.hitStunFrames + newBulletCollider := GenerateRectCollider(bulletCx, bulletCy, xfac*meleeBullet.HitboxSize.X, meleeBullet.HitboxSize.Y, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, "MeleeBullet") + newBulletCollider.Data = meleeBullet collisionSysMap[collisionBulletIndex] = newBulletCollider bulletColliders[collisionBulletIndex] = newBulletCollider newBulletCollider.Update() } } - // for _, bulletCollider := range bulletColliders { - // shouldRemove := false - // if collision := bulletCollider.Check(0, 0); collision != nil { - // bulletShape := bulletCollider.Shape.(*resolv.ConvexPolygon) - // for _, obj := range collision.Objects { - // bShape := obj.Shape.(*resolv.ConvexPolygon) - // if overlapped, pushbackX, pushbackY, overlapResult := CalcPushbacks(0, 0, bulletShape, bShape); overlapped { - // bulletPushbacks[joinIndex-1].X += pushbackX - // bulletPushbacks[joinIndex-1].Y += pushbackY - // } - // } - // shouldRemove = true - // } - // if shouldRemove { - // removedBulletsAtCurrFrame[bulletCollider.CollisionBulletIndex] = 1 - // } - // } + for _, bulletCollider := range bulletColliders { + shouldRemove := false + meleeBullet := bulletCollider.Data.(*MeleeBullet) + collisionBulletIndex := COLLISION_BULLET_INDEX_PREFIX + meleeBullet.BattleLocalId + if collision := bulletCollider.Check(0, 0); collision != nil { + offender := currRenderFrame.Players[meleeBullet.OffenderPlayerId] + bulletShape := bulletCollider.Shape.(*resolv.ConvexPolygon) + for _, obj := range collision.Objects { + switch t := obj.Data.(type) { + case Player: + defenderShape := obj.Shape.(*resolv.ConvexPolygon) + if meleeBullet.OffenderPlayerId != t.Id { + if overlapped, _, _, _ := CalcPushbacks(0, 0, bulletShape, defenderShape); overlapped { + xfac := float64(1.0) // By now, straight Punch offset doesn't respect "y-axis" + if 0 > offender.DirX { + xfac = float64(-1.0) + } + bulletPushbacks[t.JoinIndex-1].X += xfac * meleeBullet.Pushback + nextRenderFramePlayers[t.Id].CharacterState = ATK_CHARACTER_STATE_ATKED1 + oldFramesToRecover := nextRenderFramePlayers[t.Id].FramesToRecover + if meleeBullet.HitStunFrames > oldFramesToRecover { + nextRenderFramePlayers[t.Id].FramesToRecover = meleeBullet.HitStunFrames + } + } + } + default: + Logger.Debug(fmt.Sprintf("Bullet collided with non-player: roomId=%v, currRenderFrame.Id=%v, delayedInputFrame.Id=%v", pR.Id, currRenderFrame.Id, delayedInputFrame.InputFrameId)) + } + } + shouldRemove = true + } + if shouldRemove { + removedBulletsAtCurrFrame[collisionBulletIndex] = 1 + } + } for _, meleeBullet := range currRenderFrame.MeleeBullets { collisionBulletIndex := COLLISION_BULLET_INDEX_PREFIX + meleeBullet.BattleLocalId @@ -1262,27 +1316,59 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF } if nil != delayedInputFrame { + var delayedInputFrameForPrevRenderFrame *InputFrameDownsync = nil + tmp := pR.InputsBuffer.GetByFrameId(pR.ConvertToInputFrameId(currRenderFrame.Id-1, pR.InputDelayFrames)) + if nil != tmp { + delayedInputFrameForPrevRenderFrame = tmp.(*InputFrameDownsync) + } inputList := delayedInputFrame.InputList // Process player inputs for playerId, player := range pR.Players { joinIndex := player.JoinIndex collisionPlayerIndex := COLLISION_PLAYER_INDEX_PREFIX + joinIndex playerCollider := collisionSysMap[collisionPlayerIndex] - if 0 < nextRenderFramePlayers[playerId].FramesToRecover { + thatPlayerInNextFrame := nextRenderFramePlayers[playerId] + if 0 < thatPlayerInNextFrame.FramesToRecover { // No need to process inputs for this player, but there might be bullet pushbacks on this player playerCollider.X += bulletPushbacks[joinIndex-1].X playerCollider.Y += bulletPushbacks[joinIndex-1].Y + // Update in the collision system + playerCollider.Update() continue } currPlayerDownsync := currRenderFrame.Players[playerId] decodedInput := pR.decodeInput(inputList[joinIndex-1]) + prevBtnALevel := int32(0) + if nil != delayedInputFrameForPrevRenderFrame { + prevDecodedInput := pR.decodeInput(delayedInputFrameForPrevRenderFrame.InputList[joinIndex-1]) + prevBtnALevel = prevDecodedInput.BtnALevel + } - if 0 != decodedInput.Dx || 0 != decodedInput.Dy { - nextRenderFramePlayers[playerId].DirX = decodedInput.Dx - nextRenderFramePlayers[playerId].DirY = decodedInput.Dy - nextRenderFramePlayers[playerId].CharacterState = 1 + if decodedInput.BtnALevel > prevBtnALevel { + punchSkillId := int32(1) + punchConfig := pR.MeleeSkillConfig[punchSkillId] + var newMeleeBullet MeleeBullet = *punchConfig + newMeleeBullet.BattleLocalId = pR.BulletBattleLocalIdCounter + pR.BulletBattleLocalIdCounter += 1 + newMeleeBullet.OffenderJoinIndex = joinIndex + newMeleeBullet.OffenderPlayerId = playerId + newMeleeBullet.OriginatedRenderFrameId = currRenderFrame.Id + toRet.MeleeBullets = append(toRet.MeleeBullets, &newMeleeBullet) + thatPlayerInNextFrame.FramesToRecover = newMeleeBullet.RecoveryFrames + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_ATK1 + Logger.Info(fmt.Sprintf("roomId=%v, playerId=%v triggered a rising-edge of btnA at currRenderFrame.id=%v, delayedInputFrame.id=%v", pR.Id, playerId, currRenderFrame.Id, delayedInputFrame.InputFrameId)) + + } else if decodedInput.BtnALevel < prevBtnALevel { + Logger.Info(fmt.Sprintf("roomId=%v, playerId=%v triggered a falling-edge of btnA at currRenderFrame.id=%v, delayedInputFrame.id=%v", pR.Id, playerId, currRenderFrame.Id, delayedInputFrame.InputFrameId)) } else { - nextRenderFramePlayers[playerId].CharacterState = 0 + // No bullet trigger, process movement inputs + if 0 != decodedInput.Dx || 0 != decodedInput.Dy { + thatPlayerInNextFrame.DirX = decodedInput.Dx + thatPlayerInNextFrame.DirY = decodedInput.Dy + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_WALKING + } else { + thatPlayerInNextFrame.CharacterState = ATK_CHARACTER_STATE_IDLE1 + } } movementX, movementY := VirtualGridToWorldPos(decodedInput.Dx+decodedInput.Dx*currPlayerDownsync.Speed, decodedInput.Dy+decodedInput.Dy*currPlayerDownsync.Speed, pR.VirtualGridToWorldRatio) @@ -1320,8 +1406,8 @@ func (pR *Room) applyInputFrameDownsyncDynamicsOnSingleRenderFrame(delayedInputF // Update "virtual grid position" newVx, newVy := PolygonColliderAnchorToVirtualGridPos(playerCollider.X-effPushbacks[joinIndex-1].X, playerCollider.Y-effPushbacks[joinIndex-1].Y, player.ColliderRadius, player.ColliderRadius, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, pR.WorldToVirtualGridRatio) - nextRenderFramePlayers[playerId].VirtualGridX = newVx - nextRenderFramePlayers[playerId].VirtualGridY = newVy + thatPlayerInNextFrame := nextRenderFramePlayers[playerId] + thatPlayerInNextFrame.VirtualGridX, thatPlayerInNextFrame.VirtualGridY = newVx, newVy } Logger.Debug(fmt.Sprintf("After applyInputFrameDownsyncDynamicsOnSingleRenderFrame: currRenderFrame.Id=%v, inputList=%v, currRenderFrame.Players=%v, nextRenderFramePlayers=%v", currRenderFrame.Id, inputList, currRenderFrame.Players, nextRenderFramePlayers)) @@ -1352,6 +1438,7 @@ func (pR *Room) refreshColliders(spaceW, spaceH int32) { for _, player := range pR.Players { wx, wy := VirtualGridToWorldPos(player.VirtualGridX, player.VirtualGridY, pR.VirtualGridToWorldRatio) playerCollider := GenerateRectCollider(wx, wy, player.ColliderRadius*2, player.ColliderRadius*2, pR.collisionSpaceOffsetX, pR.collisionSpaceOffsetY, "Player") + playerCollider.Data = player space.Add(playerCollider) // Keep track of the collider in "pR.CollisionSysMap" joinIndex := player.JoinIndex diff --git a/battle_srv/protos/room_downsync_frame.pb.go b/battle_srv/protos/room_downsync_frame.pb.go index 9a37967..74d94cb 100644 --- a/battle_srv/protos/room_downsync_frame.pb.go +++ b/battle_srv/protos/room_downsync_frame.pb.go @@ -21,6 +21,792 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type PlayerDownsync struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` + VirtualGridX int32 `protobuf:"varint,2,opt,name=virtualGridX,proto3" json:"virtualGridX,omitempty"` + VirtualGridY int32 `protobuf:"varint,3,opt,name=virtualGridY,proto3" json:"virtualGridY,omitempty"` + DirX int32 `protobuf:"varint,4,opt,name=dirX,proto3" json:"dirX,omitempty"` + DirY int32 `protobuf:"varint,5,opt,name=dirY,proto3" json:"dirY,omitempty"` + Speed int32 `protobuf:"varint,6,opt,name=speed,proto3" json:"speed,omitempty"` // in terms of virtual grid units + BattleState int32 `protobuf:"varint,7,opt,name=battleState,proto3" json:"battleState,omitempty"` + JoinIndex int32 `protobuf:"varint,8,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` + ColliderRadius float64 `protobuf:"fixed64,9,opt,name=colliderRadius,proto3" json:"colliderRadius,omitempty"` + Removed bool `protobuf:"varint,10,opt,name=removed,proto3" json:"removed,omitempty"` + Score int32 `protobuf:"varint,11,opt,name=score,proto3" json:"score,omitempty"` + LastMoveGmtMillis int32 `protobuf:"varint,12,opt,name=lastMoveGmtMillis,proto3" json:"lastMoveGmtMillis,omitempty"` + FramesToRecover int32 `protobuf:"varint,13,opt,name=framesToRecover,proto3" json:"framesToRecover,omitempty"` + Hp int32 `protobuf:"varint,14,opt,name=hp,proto3" json:"hp,omitempty"` + MaxHp int32 `protobuf:"varint,15,opt,name=maxHp,proto3" json:"maxHp,omitempty"` + CharacterState int32 `protobuf:"varint,16,opt,name=characterState,proto3" json:"characterState,omitempty"` + Name string `protobuf:"bytes,17,opt,name=name,proto3" json:"name,omitempty"` + DisplayName string `protobuf:"bytes,18,opt,name=displayName,proto3" json:"displayName,omitempty"` + Avatar string `protobuf:"bytes,19,opt,name=avatar,proto3" json:"avatar,omitempty"` +} + +func (x *PlayerDownsync) Reset() { + *x = PlayerDownsync{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PlayerDownsync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PlayerDownsync) ProtoMessage() {} + +func (x *PlayerDownsync) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[0] + 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 PlayerDownsync.ProtoReflect.Descriptor instead. +func (*PlayerDownsync) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{0} +} + +func (x *PlayerDownsync) GetId() int32 { + if x != nil { + return x.Id + } + return 0 +} + +func (x *PlayerDownsync) GetVirtualGridX() int32 { + if x != nil { + return x.VirtualGridX + } + return 0 +} + +func (x *PlayerDownsync) GetVirtualGridY() int32 { + if x != nil { + return x.VirtualGridY + } + return 0 +} + +func (x *PlayerDownsync) GetDirX() int32 { + if x != nil { + return x.DirX + } + return 0 +} + +func (x *PlayerDownsync) GetDirY() int32 { + if x != nil { + return x.DirY + } + return 0 +} + +func (x *PlayerDownsync) GetSpeed() int32 { + if x != nil { + return x.Speed + } + return 0 +} + +func (x *PlayerDownsync) GetBattleState() int32 { + if x != nil { + return x.BattleState + } + return 0 +} + +func (x *PlayerDownsync) GetJoinIndex() int32 { + if x != nil { + return x.JoinIndex + } + return 0 +} + +func (x *PlayerDownsync) GetColliderRadius() float64 { + if x != nil { + return x.ColliderRadius + } + return 0 +} + +func (x *PlayerDownsync) GetRemoved() bool { + if x != nil { + return x.Removed + } + return false +} + +func (x *PlayerDownsync) GetScore() int32 { + if x != nil { + return x.Score + } + return 0 +} + +func (x *PlayerDownsync) GetLastMoveGmtMillis() int32 { + if x != nil { + return x.LastMoveGmtMillis + } + return 0 +} + +func (x *PlayerDownsync) GetFramesToRecover() int32 { + if x != nil { + return x.FramesToRecover + } + return 0 +} + +func (x *PlayerDownsync) GetHp() int32 { + if x != nil { + return x.Hp + } + return 0 +} + +func (x *PlayerDownsync) GetMaxHp() int32 { + if x != nil { + return x.MaxHp + } + return 0 +} + +func (x *PlayerDownsync) GetCharacterState() int32 { + if x != nil { + return x.CharacterState + } + return 0 +} + +func (x *PlayerDownsync) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *PlayerDownsync) GetDisplayName() string { + if x != nil { + return x.DisplayName + } + return "" +} + +func (x *PlayerDownsync) GetAvatar() string { + if x != nil { + return x.Avatar + } + return "" +} + +type InputFrameDecoded struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Dx int32 `protobuf:"varint,1,opt,name=dx,proto3" json:"dx,omitempty"` + Dy int32 `protobuf:"varint,2,opt,name=dy,proto3" json:"dy,omitempty"` + BtnALevel int32 `protobuf:"varint,3,opt,name=btnALevel,proto3" json:"btnALevel,omitempty"` +} + +func (x *InputFrameDecoded) Reset() { + *x = InputFrameDecoded{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InputFrameDecoded) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InputFrameDecoded) ProtoMessage() {} + +func (x *InputFrameDecoded) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[1] + 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 InputFrameDecoded.ProtoReflect.Descriptor instead. +func (*InputFrameDecoded) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{1} +} + +func (x *InputFrameDecoded) GetDx() int32 { + if x != nil { + return x.Dx + } + return 0 +} + +func (x *InputFrameDecoded) GetDy() int32 { + if x != nil { + return x.Dy + } + return 0 +} + +func (x *InputFrameDecoded) GetBtnALevel() int32 { + if x != nil { + return x.BtnALevel + } + return 0 +} + +type InputFrameUpsync struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + InputFrameId int32 `protobuf:"varint,1,opt,name=inputFrameId,proto3" json:"inputFrameId,omitempty"` + Encoded uint64 `protobuf:"varint,2,opt,name=encoded,proto3" json:"encoded,omitempty"` +} + +func (x *InputFrameUpsync) Reset() { + *x = InputFrameUpsync{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InputFrameUpsync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InputFrameUpsync) ProtoMessage() {} + +func (x *InputFrameUpsync) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[2] + 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 InputFrameUpsync.ProtoReflect.Descriptor instead. +func (*InputFrameUpsync) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{2} +} + +func (x *InputFrameUpsync) GetInputFrameId() int32 { + if x != nil { + return x.InputFrameId + } + return 0 +} + +func (x *InputFrameUpsync) GetEncoded() uint64 { + if x != nil { + return x.Encoded + } + return 0 +} + +type InputFrameDownsync struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + InputFrameId int32 `protobuf:"varint,1,opt,name=inputFrameId,proto3" json:"inputFrameId,omitempty"` + InputList []uint64 `protobuf:"varint,2,rep,packed,name=inputList,proto3" json:"inputList,omitempty"` // Indexed by "joinIndex", we try to compress the "single player input" into 1 word (64-bit for 64-bit Golang runtime) because atomic compare-and-swap only works on 1 word. Although CAS on custom struct is possible in Golang 1.19 https://pkg.go.dev/sync/atomic@go1.19.1#Value.CompareAndSwap, using a single word is still faster whenever possible. + ConfirmedList uint64 `protobuf:"varint,3,opt,name=confirmedList,proto3" json:"confirmedList,omitempty"` // Indexed by "joinIndex", same compression concern as above +} + +func (x *InputFrameDownsync) Reset() { + *x = InputFrameDownsync{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *InputFrameDownsync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*InputFrameDownsync) ProtoMessage() {} + +func (x *InputFrameDownsync) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[3] + 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 InputFrameDownsync.ProtoReflect.Descriptor instead. +func (*InputFrameDownsync) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{3} +} + +func (x *InputFrameDownsync) GetInputFrameId() int32 { + if x != nil { + return x.InputFrameId + } + return 0 +} + +func (x *InputFrameDownsync) GetInputList() []uint64 { + if x != nil { + return x.InputList + } + return nil +} + +func (x *InputFrameDownsync) GetConfirmedList() uint64 { + if x != nil { + return x.ConfirmedList + } + return 0 +} + +type HeartbeatUpsync struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + ClientTimestamp int64 `protobuf:"varint,1,opt,name=clientTimestamp,proto3" json:"clientTimestamp,omitempty"` +} + +func (x *HeartbeatUpsync) Reset() { + *x = HeartbeatUpsync{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *HeartbeatUpsync) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*HeartbeatUpsync) ProtoMessage() {} + +func (x *HeartbeatUpsync) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[4] + 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 HeartbeatUpsync.ProtoReflect.Descriptor instead. +func (*HeartbeatUpsync) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{4} +} + +func (x *HeartbeatUpsync) GetClientTimestamp() int64 { + if x != nil { + return x.ClientTimestamp + } + return 0 +} + +type WsReq struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + MsgId int32 `protobuf:"varint,1,opt,name=msgId,proto3" json:"msgId,omitempty"` + PlayerId int32 `protobuf:"varint,2,opt,name=playerId,proto3" json:"playerId,omitempty"` + Act int32 `protobuf:"varint,3,opt,name=act,proto3" json:"act,omitempty"` + JoinIndex int32 `protobuf:"varint,4,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` + AckingFrameId int32 `protobuf:"varint,5,opt,name=ackingFrameId,proto3" json:"ackingFrameId,omitempty"` + AckingInputFrameId int32 `protobuf:"varint,6,opt,name=ackingInputFrameId,proto3" json:"ackingInputFrameId,omitempty"` + InputFrameUpsyncBatch []*InputFrameUpsync `protobuf:"bytes,7,rep,name=inputFrameUpsyncBatch,proto3" json:"inputFrameUpsyncBatch,omitempty"` + Hb *HeartbeatUpsync `protobuf:"bytes,8,opt,name=hb,proto3" json:"hb,omitempty"` +} + +func (x *WsReq) Reset() { + *x = WsReq{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WsReq) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WsReq) ProtoMessage() {} + +func (x *WsReq) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[5] + 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 WsReq.ProtoReflect.Descriptor instead. +func (*WsReq) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{5} +} + +func (x *WsReq) GetMsgId() int32 { + if x != nil { + return x.MsgId + } + return 0 +} + +func (x *WsReq) GetPlayerId() int32 { + if x != nil { + return x.PlayerId + } + return 0 +} + +func (x *WsReq) GetAct() int32 { + if x != nil { + return x.Act + } + return 0 +} + +func (x *WsReq) GetJoinIndex() int32 { + if x != nil { + return x.JoinIndex + } + return 0 +} + +func (x *WsReq) GetAckingFrameId() int32 { + if x != nil { + return x.AckingFrameId + } + return 0 +} + +func (x *WsReq) GetAckingInputFrameId() int32 { + if x != nil { + return x.AckingInputFrameId + } + return 0 +} + +func (x *WsReq) GetInputFrameUpsyncBatch() []*InputFrameUpsync { + if x != nil { + return x.InputFrameUpsyncBatch + } + return nil +} + +func (x *WsReq) GetHb() *HeartbeatUpsync { + if x != nil { + return x.Hb + } + return nil +} + +type WsResp struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Ret int32 `protobuf:"varint,1,opt,name=ret,proto3" json:"ret,omitempty"` + EchoedMsgId int32 `protobuf:"varint,2,opt,name=echoedMsgId,proto3" json:"echoedMsgId,omitempty"` + Act int32 `protobuf:"varint,3,opt,name=act,proto3" json:"act,omitempty"` + Rdf *RoomDownsyncFrame `protobuf:"bytes,4,opt,name=rdf,proto3" json:"rdf,omitempty"` + InputFrameDownsyncBatch []*InputFrameDownsync `protobuf:"bytes,5,rep,name=inputFrameDownsyncBatch,proto3" json:"inputFrameDownsyncBatch,omitempty"` + BciFrame *BattleColliderInfo `protobuf:"bytes,6,opt,name=bciFrame,proto3" json:"bciFrame,omitempty"` +} + +func (x *WsResp) Reset() { + *x = WsResp{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *WsResp) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*WsResp) ProtoMessage() {} + +func (x *WsResp) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[6] + 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 WsResp.ProtoReflect.Descriptor instead. +func (*WsResp) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{6} +} + +func (x *WsResp) GetRet() int32 { + if x != nil { + return x.Ret + } + return 0 +} + +func (x *WsResp) GetEchoedMsgId() int32 { + if x != nil { + return x.EchoedMsgId + } + return 0 +} + +func (x *WsResp) GetAct() int32 { + if x != nil { + return x.Act + } + return 0 +} + +func (x *WsResp) GetRdf() *RoomDownsyncFrame { + if x != nil { + return x.Rdf + } + return nil +} + +func (x *WsResp) GetInputFrameDownsyncBatch() []*InputFrameDownsync { + if x != nil { + return x.InputFrameDownsyncBatch + } + return nil +} + +func (x *WsResp) GetBciFrame() *BattleColliderInfo { + if x != nil { + return x.BciFrame + } + return nil +} + +type MeleeBullet struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // for offender + BattleLocalId int32 `protobuf:"varint,1,opt,name=battleLocalId,proto3" json:"battleLocalId,omitempty"` + StartupFrames int32 `protobuf:"varint,2,opt,name=startupFrames,proto3" json:"startupFrames,omitempty"` + ActiveFrames int32 `protobuf:"varint,3,opt,name=activeFrames,proto3" json:"activeFrames,omitempty"` + RecoveryFrames int32 `protobuf:"varint,4,opt,name=recoveryFrames,proto3" json:"recoveryFrames,omitempty"` + RecoveryFramesOnBlock int32 `protobuf:"varint,5,opt,name=recoveryFramesOnBlock,proto3" json:"recoveryFramesOnBlock,omitempty"` + RecoveryFramesOnHit int32 `protobuf:"varint,6,opt,name=recoveryFramesOnHit,proto3" json:"recoveryFramesOnHit,omitempty"` + Moveforward *sharedprotos.Vec2D `protobuf:"bytes,7,opt,name=moveforward,proto3" json:"moveforward,omitempty"` + HitboxOffset float64 `protobuf:"fixed64,8,opt,name=hitboxOffset,proto3" json:"hitboxOffset,omitempty"` + HitboxSize *sharedprotos.Vec2D `protobuf:"bytes,9,opt,name=hitboxSize,proto3" json:"hitboxSize,omitempty"` + OriginatedRenderFrameId int32 `protobuf:"varint,10,opt,name=originatedRenderFrameId,proto3" json:"originatedRenderFrameId,omitempty"` + // for defender + HitStunFrames int32 `protobuf:"varint,11,opt,name=hitStunFrames,proto3" json:"hitStunFrames,omitempty"` + BlockStunFrames int32 `protobuf:"varint,12,opt,name=blockStunFrames,proto3" json:"blockStunFrames,omitempty"` + Pushback float64 `protobuf:"fixed64,13,opt,name=pushback,proto3" json:"pushback,omitempty"` + ReleaseTriggerType int32 `protobuf:"varint,14,opt,name=releaseTriggerType,proto3" json:"releaseTriggerType,omitempty"` // 1: rising-edge, 2: falling-edge + Damage int32 `protobuf:"varint,15,opt,name=damage,proto3" json:"damage,omitempty"` + OffenderJoinIndex int32 `protobuf:"varint,16,opt,name=offenderJoinIndex,proto3" json:"offenderJoinIndex,omitempty"` + OffenderPlayerId int32 `protobuf:"varint,17,opt,name=offenderPlayerId,proto3" json:"offenderPlayerId,omitempty"` +} + +func (x *MeleeBullet) Reset() { + *x = MeleeBullet{} + if protoimpl.UnsafeEnabled { + mi := &file_room_downsync_frame_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MeleeBullet) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MeleeBullet) ProtoMessage() {} + +func (x *MeleeBullet) ProtoReflect() protoreflect.Message { + mi := &file_room_downsync_frame_proto_msgTypes[7] + 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 MeleeBullet.ProtoReflect.Descriptor instead. +func (*MeleeBullet) Descriptor() ([]byte, []int) { + return file_room_downsync_frame_proto_rawDescGZIP(), []int{7} +} + +func (x *MeleeBullet) GetBattleLocalId() int32 { + if x != nil { + return x.BattleLocalId + } + return 0 +} + +func (x *MeleeBullet) GetStartupFrames() int32 { + if x != nil { + return x.StartupFrames + } + return 0 +} + +func (x *MeleeBullet) GetActiveFrames() int32 { + if x != nil { + return x.ActiveFrames + } + return 0 +} + +func (x *MeleeBullet) GetRecoveryFrames() int32 { + if x != nil { + return x.RecoveryFrames + } + return 0 +} + +func (x *MeleeBullet) GetRecoveryFramesOnBlock() int32 { + if x != nil { + return x.RecoveryFramesOnBlock + } + return 0 +} + +func (x *MeleeBullet) GetRecoveryFramesOnHit() int32 { + if x != nil { + return x.RecoveryFramesOnHit + } + return 0 +} + +func (x *MeleeBullet) GetMoveforward() *sharedprotos.Vec2D { + if x != nil { + return x.Moveforward + } + return nil +} + +func (x *MeleeBullet) GetHitboxOffset() float64 { + if x != nil { + return x.HitboxOffset + } + return 0 +} + +func (x *MeleeBullet) GetHitboxSize() *sharedprotos.Vec2D { + if x != nil { + return x.HitboxSize + } + return nil +} + +func (x *MeleeBullet) GetOriginatedRenderFrameId() int32 { + if x != nil { + return x.OriginatedRenderFrameId + } + return 0 +} + +func (x *MeleeBullet) GetHitStunFrames() int32 { + if x != nil { + return x.HitStunFrames + } + return 0 +} + +func (x *MeleeBullet) GetBlockStunFrames() int32 { + if x != nil { + return x.BlockStunFrames + } + return 0 +} + +func (x *MeleeBullet) GetPushback() float64 { + if x != nil { + return x.Pushback + } + return 0 +} + +func (x *MeleeBullet) GetReleaseTriggerType() int32 { + if x != nil { + return x.ReleaseTriggerType + } + return 0 +} + +func (x *MeleeBullet) GetDamage() int32 { + if x != nil { + return x.Damage + } + return 0 +} + +func (x *MeleeBullet) GetOffenderJoinIndex() int32 { + if x != nil { + return x.OffenderJoinIndex + } + return 0 +} + +func (x *MeleeBullet) GetOffenderPlayerId() int32 { + if x != nil { + return x.OffenderPlayerId + } + return 0 +} + type BattleColliderInfo struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -50,12 +836,13 @@ type BattleColliderInfo struct { VirtualGridToWorldRatio float64 `protobuf:"fixed64,22,opt,name=virtualGridToWorldRatio,proto3" json:"virtualGridToWorldRatio,omitempty"` SpAtkLookupFrames int32 `protobuf:"varint,23,opt,name=spAtkLookupFrames,proto3" json:"spAtkLookupFrames,omitempty"` RenderCacheSize int32 `protobuf:"varint,24,opt,name=renderCacheSize,proto3" json:"renderCacheSize,omitempty"` + MeleeSkillConfig map[int32]*MeleeBullet `protobuf:"bytes,25,rep,name=meleeSkillConfig,proto3" json:"meleeSkillConfig,omitempty" protobuf_key:"varint,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` // skillId -> skill } func (x *BattleColliderInfo) Reset() { *x = BattleColliderInfo{} if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[0] + mi := &file_room_downsync_frame_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -68,7 +855,7 @@ func (x *BattleColliderInfo) String() string { func (*BattleColliderInfo) ProtoMessage() {} func (x *BattleColliderInfo) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[0] + mi := &file_room_downsync_frame_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -81,7 +868,7 @@ func (x *BattleColliderInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use BattleColliderInfo.ProtoReflect.Descriptor instead. func (*BattleColliderInfo) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{0} + return file_room_downsync_frame_proto_rawDescGZIP(), []int{8} } func (x *BattleColliderInfo) GetStageName() string { @@ -252,792 +1039,13 @@ func (x *BattleColliderInfo) GetRenderCacheSize() int32 { return 0 } -type PlayerDownsync struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Id int32 `protobuf:"varint,1,opt,name=id,proto3" json:"id,omitempty"` - VirtualGridX int32 `protobuf:"varint,2,opt,name=virtualGridX,proto3" json:"virtualGridX,omitempty"` - VirtualGridY int32 `protobuf:"varint,3,opt,name=virtualGridY,proto3" json:"virtualGridY,omitempty"` - DirX int32 `protobuf:"varint,4,opt,name=dirX,proto3" json:"dirX,omitempty"` - DirY int32 `protobuf:"varint,5,opt,name=dirY,proto3" json:"dirY,omitempty"` - Speed int32 `protobuf:"varint,6,opt,name=speed,proto3" json:"speed,omitempty"` // in terms of virtual grid units - BattleState int32 `protobuf:"varint,7,opt,name=battleState,proto3" json:"battleState,omitempty"` - JoinIndex int32 `protobuf:"varint,8,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` - ColliderRadius float64 `protobuf:"fixed64,9,opt,name=colliderRadius,proto3" json:"colliderRadius,omitempty"` - Removed bool `protobuf:"varint,10,opt,name=removed,proto3" json:"removed,omitempty"` - Score int32 `protobuf:"varint,11,opt,name=score,proto3" json:"score,omitempty"` - LastMoveGmtMillis int32 `protobuf:"varint,12,opt,name=lastMoveGmtMillis,proto3" json:"lastMoveGmtMillis,omitempty"` - FramesToRecover int32 `protobuf:"varint,13,opt,name=framesToRecover,proto3" json:"framesToRecover,omitempty"` - Hp int32 `protobuf:"varint,14,opt,name=hp,proto3" json:"hp,omitempty"` - MaxHp int32 `protobuf:"varint,15,opt,name=maxHp,proto3" json:"maxHp,omitempty"` - CharacterState int32 `protobuf:"varint,16,opt,name=characterState,proto3" json:"characterState,omitempty"` - Name string `protobuf:"bytes,17,opt,name=name,proto3" json:"name,omitempty"` - DisplayName string `protobuf:"bytes,18,opt,name=displayName,proto3" json:"displayName,omitempty"` - Avatar string `protobuf:"bytes,19,opt,name=avatar,proto3" json:"avatar,omitempty"` -} - -func (x *PlayerDownsync) Reset() { - *x = PlayerDownsync{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *PlayerDownsync) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*PlayerDownsync) ProtoMessage() {} - -func (x *PlayerDownsync) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[1] - 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 PlayerDownsync.ProtoReflect.Descriptor instead. -func (*PlayerDownsync) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{1} -} - -func (x *PlayerDownsync) GetId() int32 { +func (x *BattleColliderInfo) GetMeleeSkillConfig() map[int32]*MeleeBullet { if x != nil { - return x.Id - } - return 0 -} - -func (x *PlayerDownsync) GetVirtualGridX() int32 { - if x != nil { - return x.VirtualGridX - } - return 0 -} - -func (x *PlayerDownsync) GetVirtualGridY() int32 { - if x != nil { - return x.VirtualGridY - } - return 0 -} - -func (x *PlayerDownsync) GetDirX() int32 { - if x != nil { - return x.DirX - } - return 0 -} - -func (x *PlayerDownsync) GetDirY() int32 { - if x != nil { - return x.DirY - } - return 0 -} - -func (x *PlayerDownsync) GetSpeed() int32 { - if x != nil { - return x.Speed - } - return 0 -} - -func (x *PlayerDownsync) GetBattleState() int32 { - if x != nil { - return x.BattleState - } - return 0 -} - -func (x *PlayerDownsync) GetJoinIndex() int32 { - if x != nil { - return x.JoinIndex - } - return 0 -} - -func (x *PlayerDownsync) GetColliderRadius() float64 { - if x != nil { - return x.ColliderRadius - } - return 0 -} - -func (x *PlayerDownsync) GetRemoved() bool { - if x != nil { - return x.Removed - } - return false -} - -func (x *PlayerDownsync) GetScore() int32 { - if x != nil { - return x.Score - } - return 0 -} - -func (x *PlayerDownsync) GetLastMoveGmtMillis() int32 { - if x != nil { - return x.LastMoveGmtMillis - } - return 0 -} - -func (x *PlayerDownsync) GetFramesToRecover() int32 { - if x != nil { - return x.FramesToRecover - } - return 0 -} - -func (x *PlayerDownsync) GetHp() int32 { - if x != nil { - return x.Hp - } - return 0 -} - -func (x *PlayerDownsync) GetMaxHp() int32 { - if x != nil { - return x.MaxHp - } - return 0 -} - -func (x *PlayerDownsync) GetCharacterState() int32 { - if x != nil { - return x.CharacterState - } - return 0 -} - -func (x *PlayerDownsync) GetName() string { - if x != nil { - return x.Name - } - return "" -} - -func (x *PlayerDownsync) GetDisplayName() string { - if x != nil { - return x.DisplayName - } - return "" -} - -func (x *PlayerDownsync) GetAvatar() string { - if x != nil { - return x.Avatar - } - return "" -} - -type InputFrameDecoded struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Dx int32 `protobuf:"varint,1,opt,name=dx,proto3" json:"dx,omitempty"` - Dy int32 `protobuf:"varint,2,opt,name=dy,proto3" json:"dy,omitempty"` - BtnALevel int32 `protobuf:"varint,3,opt,name=btnALevel,proto3" json:"btnALevel,omitempty"` -} - -func (x *InputFrameDecoded) Reset() { - *x = InputFrameDecoded{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *InputFrameDecoded) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InputFrameDecoded) ProtoMessage() {} - -func (x *InputFrameDecoded) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[2] - 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 InputFrameDecoded.ProtoReflect.Descriptor instead. -func (*InputFrameDecoded) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{2} -} - -func (x *InputFrameDecoded) GetDx() int32 { - if x != nil { - return x.Dx - } - return 0 -} - -func (x *InputFrameDecoded) GetDy() int32 { - if x != nil { - return x.Dy - } - return 0 -} - -func (x *InputFrameDecoded) GetBtnALevel() int32 { - if x != nil { - return x.BtnALevel - } - return 0 -} - -type InputFrameUpsync struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - InputFrameId int32 `protobuf:"varint,1,opt,name=inputFrameId,proto3" json:"inputFrameId,omitempty"` - Encoded uint64 `protobuf:"varint,2,opt,name=encoded,proto3" json:"encoded,omitempty"` -} - -func (x *InputFrameUpsync) Reset() { - *x = InputFrameUpsync{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *InputFrameUpsync) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InputFrameUpsync) ProtoMessage() {} - -func (x *InputFrameUpsync) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[3] - 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 InputFrameUpsync.ProtoReflect.Descriptor instead. -func (*InputFrameUpsync) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{3} -} - -func (x *InputFrameUpsync) GetInputFrameId() int32 { - if x != nil { - return x.InputFrameId - } - return 0 -} - -func (x *InputFrameUpsync) GetEncoded() uint64 { - if x != nil { - return x.Encoded - } - return 0 -} - -type InputFrameDownsync struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - InputFrameId int32 `protobuf:"varint,1,opt,name=inputFrameId,proto3" json:"inputFrameId,omitempty"` - InputList []uint64 `protobuf:"varint,2,rep,packed,name=inputList,proto3" json:"inputList,omitempty"` // Indexed by "joinIndex", we try to compress the "single player input" into 1 word (64-bit for 64-bit Golang runtime) because atomic compare-and-swap only works on 1 word. Although CAS on custom struct is possible in Golang 1.19 https://pkg.go.dev/sync/atomic@go1.19.1#Value.CompareAndSwap, using a single word is still faster whenever possible. - ConfirmedList uint64 `protobuf:"varint,3,opt,name=confirmedList,proto3" json:"confirmedList,omitempty"` // Indexed by "joinIndex", same compression concern as above -} - -func (x *InputFrameDownsync) Reset() { - *x = InputFrameDownsync{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *InputFrameDownsync) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*InputFrameDownsync) ProtoMessage() {} - -func (x *InputFrameDownsync) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[4] - 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 InputFrameDownsync.ProtoReflect.Descriptor instead. -func (*InputFrameDownsync) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{4} -} - -func (x *InputFrameDownsync) GetInputFrameId() int32 { - if x != nil { - return x.InputFrameId - } - return 0 -} - -func (x *InputFrameDownsync) GetInputList() []uint64 { - if x != nil { - return x.InputList + return x.MeleeSkillConfig } return nil } -func (x *InputFrameDownsync) GetConfirmedList() uint64 { - if x != nil { - return x.ConfirmedList - } - return 0 -} - -type HeartbeatUpsync struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - ClientTimestamp int64 `protobuf:"varint,1,opt,name=clientTimestamp,proto3" json:"clientTimestamp,omitempty"` -} - -func (x *HeartbeatUpsync) Reset() { - *x = HeartbeatUpsync{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *HeartbeatUpsync) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*HeartbeatUpsync) ProtoMessage() {} - -func (x *HeartbeatUpsync) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[5] - 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 HeartbeatUpsync.ProtoReflect.Descriptor instead. -func (*HeartbeatUpsync) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{5} -} - -func (x *HeartbeatUpsync) GetClientTimestamp() int64 { - if x != nil { - return x.ClientTimestamp - } - return 0 -} - -type WsReq struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - MsgId int32 `protobuf:"varint,1,opt,name=msgId,proto3" json:"msgId,omitempty"` - PlayerId int32 `protobuf:"varint,2,opt,name=playerId,proto3" json:"playerId,omitempty"` - Act int32 `protobuf:"varint,3,opt,name=act,proto3" json:"act,omitempty"` - JoinIndex int32 `protobuf:"varint,4,opt,name=joinIndex,proto3" json:"joinIndex,omitempty"` - AckingFrameId int32 `protobuf:"varint,5,opt,name=ackingFrameId,proto3" json:"ackingFrameId,omitempty"` - AckingInputFrameId int32 `protobuf:"varint,6,opt,name=ackingInputFrameId,proto3" json:"ackingInputFrameId,omitempty"` - InputFrameUpsyncBatch []*InputFrameUpsync `protobuf:"bytes,7,rep,name=inputFrameUpsyncBatch,proto3" json:"inputFrameUpsyncBatch,omitempty"` - Hb *HeartbeatUpsync `protobuf:"bytes,8,opt,name=hb,proto3" json:"hb,omitempty"` -} - -func (x *WsReq) Reset() { - *x = WsReq{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *WsReq) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*WsReq) ProtoMessage() {} - -func (x *WsReq) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[6] - 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 WsReq.ProtoReflect.Descriptor instead. -func (*WsReq) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{6} -} - -func (x *WsReq) GetMsgId() int32 { - if x != nil { - return x.MsgId - } - return 0 -} - -func (x *WsReq) GetPlayerId() int32 { - if x != nil { - return x.PlayerId - } - return 0 -} - -func (x *WsReq) GetAct() int32 { - if x != nil { - return x.Act - } - return 0 -} - -func (x *WsReq) GetJoinIndex() int32 { - if x != nil { - return x.JoinIndex - } - return 0 -} - -func (x *WsReq) GetAckingFrameId() int32 { - if x != nil { - return x.AckingFrameId - } - return 0 -} - -func (x *WsReq) GetAckingInputFrameId() int32 { - if x != nil { - return x.AckingInputFrameId - } - return 0 -} - -func (x *WsReq) GetInputFrameUpsyncBatch() []*InputFrameUpsync { - if x != nil { - return x.InputFrameUpsyncBatch - } - return nil -} - -func (x *WsReq) GetHb() *HeartbeatUpsync { - if x != nil { - return x.Hb - } - return nil -} - -type WsResp struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Ret int32 `protobuf:"varint,1,opt,name=ret,proto3" json:"ret,omitempty"` - EchoedMsgId int32 `protobuf:"varint,2,opt,name=echoedMsgId,proto3" json:"echoedMsgId,omitempty"` - Act int32 `protobuf:"varint,3,opt,name=act,proto3" json:"act,omitempty"` - Rdf *RoomDownsyncFrame `protobuf:"bytes,4,opt,name=rdf,proto3" json:"rdf,omitempty"` - InputFrameDownsyncBatch []*InputFrameDownsync `protobuf:"bytes,5,rep,name=inputFrameDownsyncBatch,proto3" json:"inputFrameDownsyncBatch,omitempty"` - BciFrame *BattleColliderInfo `protobuf:"bytes,6,opt,name=bciFrame,proto3" json:"bciFrame,omitempty"` -} - -func (x *WsResp) Reset() { - *x = WsResp{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *WsResp) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*WsResp) ProtoMessage() {} - -func (x *WsResp) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[7] - 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 WsResp.ProtoReflect.Descriptor instead. -func (*WsResp) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{7} -} - -func (x *WsResp) GetRet() int32 { - if x != nil { - return x.Ret - } - return 0 -} - -func (x *WsResp) GetEchoedMsgId() int32 { - if x != nil { - return x.EchoedMsgId - } - return 0 -} - -func (x *WsResp) GetAct() int32 { - if x != nil { - return x.Act - } - return 0 -} - -func (x *WsResp) GetRdf() *RoomDownsyncFrame { - if x != nil { - return x.Rdf - } - return nil -} - -func (x *WsResp) GetInputFrameDownsyncBatch() []*InputFrameDownsync { - if x != nil { - return x.InputFrameDownsyncBatch - } - return nil -} - -func (x *WsResp) GetBciFrame() *BattleColliderInfo { - if x != nil { - return x.BciFrame - } - return nil -} - -type MeleeBullet struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // for offender - BattleLocalId int32 `protobuf:"varint,1,opt,name=battleLocalId,proto3" json:"battleLocalId,omitempty"` - StartupFrames int32 `protobuf:"varint,2,opt,name=startupFrames,proto3" json:"startupFrames,omitempty"` - ActiveFrames int32 `protobuf:"varint,3,opt,name=activeFrames,proto3" json:"activeFrames,omitempty"` - RecoveryFrames int32 `protobuf:"varint,4,opt,name=recoveryFrames,proto3" json:"recoveryFrames,omitempty"` - RecoveryFramesOnBlock int32 `protobuf:"varint,5,opt,name=recoveryFramesOnBlock,proto3" json:"recoveryFramesOnBlock,omitempty"` - RecoveryFramesOnHit int32 `protobuf:"varint,6,opt,name=recoveryFramesOnHit,proto3" json:"recoveryFramesOnHit,omitempty"` - Moveforward *sharedprotos.Vec2D `protobuf:"bytes,7,opt,name=moveforward,proto3" json:"moveforward,omitempty"` - HitboxOffset float64 `protobuf:"fixed64,8,opt,name=hitboxOffset,proto3" json:"hitboxOffset,omitempty"` - HitboxSize *sharedprotos.Vec2D `protobuf:"bytes,9,opt,name=hitboxSize,proto3" json:"hitboxSize,omitempty"` - OriginatedRenderFrameId int32 `protobuf:"varint,10,opt,name=originatedRenderFrameId,proto3" json:"originatedRenderFrameId,omitempty"` - // for defender - HitStunFrames int32 `protobuf:"varint,11,opt,name=hitStunFrames,proto3" json:"hitStunFrames,omitempty"` - BlockStunFrames int32 `protobuf:"varint,12,opt,name=blockStunFrames,proto3" json:"blockStunFrames,omitempty"` - Pushback float64 `protobuf:"fixed64,13,opt,name=pushback,proto3" json:"pushback,omitempty"` - ReleaseTriggerType int32 `protobuf:"varint,14,opt,name=releaseTriggerType,proto3" json:"releaseTriggerType,omitempty"` // 1: rising-edge, 2: falling-edge - Damage int32 `protobuf:"varint,15,opt,name=damage,proto3" json:"damage,omitempty"` - OffenderJoinIndex int32 `protobuf:"varint,16,opt,name=offenderJoinIndex,proto3" json:"offenderJoinIndex,omitempty"` - OffenderPlayerId int32 `protobuf:"varint,17,opt,name=offenderPlayerId,proto3" json:"offenderPlayerId,omitempty"` -} - -func (x *MeleeBullet) Reset() { - *x = MeleeBullet{} - if protoimpl.UnsafeEnabled { - mi := &file_room_downsync_frame_proto_msgTypes[8] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *MeleeBullet) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*MeleeBullet) ProtoMessage() {} - -func (x *MeleeBullet) ProtoReflect() protoreflect.Message { - mi := &file_room_downsync_frame_proto_msgTypes[8] - 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 MeleeBullet.ProtoReflect.Descriptor instead. -func (*MeleeBullet) Descriptor() ([]byte, []int) { - return file_room_downsync_frame_proto_rawDescGZIP(), []int{8} -} - -func (x *MeleeBullet) GetBattleLocalId() int32 { - if x != nil { - return x.BattleLocalId - } - return 0 -} - -func (x *MeleeBullet) GetStartupFrames() int32 { - if x != nil { - return x.StartupFrames - } - return 0 -} - -func (x *MeleeBullet) GetActiveFrames() int32 { - if x != nil { - return x.ActiveFrames - } - return 0 -} - -func (x *MeleeBullet) GetRecoveryFrames() int32 { - if x != nil { - return x.RecoveryFrames - } - return 0 -} - -func (x *MeleeBullet) GetRecoveryFramesOnBlock() int32 { - if x != nil { - return x.RecoveryFramesOnBlock - } - return 0 -} - -func (x *MeleeBullet) GetRecoveryFramesOnHit() int32 { - if x != nil { - return x.RecoveryFramesOnHit - } - return 0 -} - -func (x *MeleeBullet) GetMoveforward() *sharedprotos.Vec2D { - if x != nil { - return x.Moveforward - } - return nil -} - -func (x *MeleeBullet) GetHitboxOffset() float64 { - if x != nil { - return x.HitboxOffset - } - return 0 -} - -func (x *MeleeBullet) GetHitboxSize() *sharedprotos.Vec2D { - if x != nil { - return x.HitboxSize - } - return nil -} - -func (x *MeleeBullet) GetOriginatedRenderFrameId() int32 { - if x != nil { - return x.OriginatedRenderFrameId - } - return 0 -} - -func (x *MeleeBullet) GetHitStunFrames() int32 { - if x != nil { - return x.HitStunFrames - } - return 0 -} - -func (x *MeleeBullet) GetBlockStunFrames() int32 { - if x != nil { - return x.BlockStunFrames - } - return 0 -} - -func (x *MeleeBullet) GetPushback() float64 { - if x != nil { - return x.Pushback - } - return 0 -} - -func (x *MeleeBullet) GetReleaseTriggerType() int32 { - if x != nil { - return x.ReleaseTriggerType - } - return 0 -} - -func (x *MeleeBullet) GetDamage() int32 { - if x != nil { - return x.Damage - } - return 0 -} - -func (x *MeleeBullet) GetOffenderJoinIndex() int32 { - if x != nil { - return x.OffenderJoinIndex - } - return 0 -} - -func (x *MeleeBullet) GetOffenderPlayerId() int32 { - if x != nil { - return x.OffenderPlayerId - } - return 0 -} - type RoomDownsyncFrame struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1115,257 +1123,269 @@ var file_room_downsync_frame_proto_rawDesc = []byte{ 0x0a, 0x19, 0x72, 0x6f, 0x6f, 0x6d, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x1a, 0x0e, 0x67, 0x65, 0x6f, 0x6d, 0x65, 0x74, 0x72, 0x79, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0xac, 0x0b, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, - 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x74, - 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x73, - 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x11, 0x73, 0x74, 0x72, 0x54, - 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, - 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, - 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, - 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x12, 0x6b, 0x0a, 0x15, 0x73, 0x74, 0x72, - 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, - 0x61, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, - 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x6f, 0x74, 0x6f, 0x22, 0xb2, 0x04, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, + 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, + 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x69, 0x72, 0x58, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x69, + 0x72, 0x58, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x72, 0x59, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x04, 0x64, 0x69, 0x72, 0x59, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, + 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, + 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0e, + 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, + 0x64, 0x69, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, + 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x14, + 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, + 0x63, 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, + 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, + 0x69, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, + 0x63, 0x6f, 0x76, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, + 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, + 0x68, 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x68, 0x70, 0x12, 0x14, 0x0a, 0x05, + 0x6d, 0x61, 0x78, 0x48, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x78, + 0x48, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x72, + 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, + 0x0a, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x12, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, + 0x12, 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x51, 0x0a, 0x11, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x0e, 0x0a, + 0x02, 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x78, 0x12, 0x0e, 0x0a, + 0x02, 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x79, 0x12, 0x1c, 0x0a, + 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x50, 0x0a, 0x10, 0x49, + 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, + 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, 0x7c, 0x0a, + 0x12, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, + 0x79, 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x4c, 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, + 0x74, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0f, 0x48, + 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x28, + 0x0a, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xb8, 0x02, 0x0a, 0x05, 0x57, 0x73, 0x52, + 0x65, 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, + 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, 0x63, 0x6b, + 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, + 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x15, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, + 0x79, 0x6e, 0x63, 0x52, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, + 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x02, 0x68, 0x62, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, + 0x48, 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, + 0x02, 0x68, 0x62, 0x22, 0x89, 0x02, 0x0a, 0x06, 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, + 0x0a, 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x65, 0x74, + 0x12, 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, + 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x03, 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, + 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, 0x72, 0x64, + 0x66, 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, + 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x17, + 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, + 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, + 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, + 0xe5, 0x05, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, + 0x24, 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, + 0x63, 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x26, 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, + 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, + 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x30, 0x0a, + 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, + 0x6e, 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x72, 0x65, 0x63, 0x6f, + 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x12, + 0x35, 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, + 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x68, 0x69, + 0x74, 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x68, 0x69, + 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, + 0x63, 0x32, 0x44, 0x52, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, + 0x38, 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, + 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, + 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, + 0x28, 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, + 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x73, + 0x68, 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x70, 0x75, 0x73, + 0x68, 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, + 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, + 0x72, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x18, + 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, + 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, + 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2a, 0x0a, 0x10, 0x6f, + 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, + 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x22, 0xe4, 0x0c, 0x0a, 0x12, 0x42, 0x61, 0x74, 0x74, + 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x1c, + 0x0a, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x73, 0x74, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5f, 0x0a, 0x11, + 0x73, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, + 0x70, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x49, + 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, + 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x11, 0x73, 0x74, 0x72, 0x54, + 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x12, 0x6b, 0x0a, 0x15, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, - 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, - 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x57, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x57, 0x12, 0x26, - 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, - 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, - 0x69, 0x6c, 0x65, 0x57, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x67, - 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, - 0x69, 0x6c, 0x65, 0x48, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x73, 0x74, 0x61, 0x67, - 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, - 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x12, 0x34, - 0x0a, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x77, - 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x46, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, - 0x6d, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6f, 0x75, 0x6e, 0x64, - 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x0b, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x46, 0x70, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x46, 0x70, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x44, - 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x69, 0x6e, - 0x70, 0x75, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x6e, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, - 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1e, - 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, - 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x48, - 0x0a, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, - 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, - 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x70, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x12, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x11, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, 0x61, 0x74, 0x74, 0x6c, - 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, - 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, 0x6c, - 0x6c, 0x69, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x72, 0x6f, 0x6c, 0x6c, 0x62, - 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4d, 0x69, - 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x3a, 0x0a, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, - 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, - 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, 0x61, 0x6e, 0x6f, 0x73, - 0x12, 0x38, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, 0x72, 0x74, 0x75, - 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x15, 0x20, 0x01, 0x28, - 0x01, 0x52, 0x17, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, 0x72, 0x74, 0x75, 0x61, - 0x6c, 0x47, 0x72, 0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x38, 0x0a, 0x17, 0x76, 0x69, - 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, - 0x52, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x76, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, 0x72, 0x6c, 0x64, 0x52, - 0x61, 0x74, 0x69, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x70, 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, - 0x6b, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x17, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x11, 0x73, 0x70, 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, - 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x72, 0x65, 0x6e, - 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x1a, 0x5d, 0x0a, 0x16, - 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, - 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65, 0x0a, 0x1a, 0x53, - 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, - 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, 0x68, 0x61, - 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, - 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xb2, 0x04, 0x0a, 0x0e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, - 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, - 0x47, 0x72, 0x69, 0x64, 0x58, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x76, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x58, 0x12, 0x22, 0x0a, 0x0c, 0x76, 0x69, 0x72, - 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0c, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x59, 0x12, 0x12, 0x0a, - 0x04, 0x64, 0x69, 0x72, 0x58, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x64, 0x69, 0x72, - 0x58, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x69, 0x72, 0x59, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x04, 0x64, 0x69, 0x72, 0x59, 0x12, 0x14, 0x0a, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x70, 0x65, 0x65, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x62, - 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0b, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1c, 0x0a, - 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x26, 0x0a, 0x0e, 0x63, - 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, 0x69, 0x75, 0x73, 0x18, 0x09, 0x20, - 0x01, 0x28, 0x01, 0x52, 0x0e, 0x63, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, 0x52, 0x61, 0x64, - 0x69, 0x75, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x18, 0x0a, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x12, 0x14, 0x0a, - 0x05, 0x73, 0x63, 0x6f, 0x72, 0x65, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x73, 0x63, - 0x6f, 0x72, 0x65, 0x12, 0x2c, 0x0a, 0x11, 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, - 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, - 0x6c, 0x61, 0x73, 0x74, 0x4d, 0x6f, 0x76, 0x65, 0x47, 0x6d, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, - 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x66, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, - 0x6f, 0x76, 0x65, 0x72, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x66, 0x72, 0x61, 0x6d, - 0x65, 0x73, 0x54, 0x6f, 0x52, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x12, 0x0e, 0x0a, 0x02, 0x68, - 0x70, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x68, 0x70, 0x12, 0x14, 0x0a, 0x05, 0x6d, - 0x61, 0x78, 0x48, 0x70, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6d, 0x61, 0x78, 0x48, - 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x63, 0x68, 0x61, 0x72, 0x61, - 0x63, 0x74, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x20, 0x0a, - 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x18, 0x12, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x64, 0x69, 0x73, 0x70, 0x6c, 0x61, 0x79, 0x4e, 0x61, 0x6d, 0x65, 0x12, - 0x16, 0x0a, 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x18, 0x13, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x61, 0x76, 0x61, 0x74, 0x61, 0x72, 0x22, 0x51, 0x0a, 0x11, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x65, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x12, 0x0e, 0x0a, 0x02, - 0x64, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x78, 0x12, 0x0e, 0x0a, 0x02, - 0x64, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x64, 0x79, 0x12, 0x1c, 0x0a, 0x09, - 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x09, 0x62, 0x74, 0x6e, 0x41, 0x4c, 0x65, 0x76, 0x65, 0x6c, 0x22, 0x50, 0x0a, 0x10, 0x49, 0x6e, - 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x22, - 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x49, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x6e, 0x63, 0x6f, 0x64, 0x65, 0x64, 0x22, 0x7c, 0x0a, 0x12, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, - 0x6e, 0x63, 0x12, 0x22, 0x0a, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x4c, - 0x69, 0x73, 0x74, 0x18, 0x02, 0x20, 0x03, 0x28, 0x04, 0x52, 0x09, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, - 0x64, 0x4c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x22, 0x3b, 0x0a, 0x0f, 0x48, 0x65, - 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x12, 0x28, 0x0a, - 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xb8, 0x02, 0x0a, 0x05, 0x57, 0x73, 0x52, 0x65, - 0x71, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x05, 0x6d, 0x73, 0x67, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x70, 0x6c, 0x61, 0x79, 0x65, - 0x72, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x03, 0x61, 0x63, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x6a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x49, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x61, 0x63, 0x6b, 0x69, - 0x6e, 0x67, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x12, 0x61, 0x63, 0x6b, - 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x12, 0x61, 0x63, 0x6b, 0x69, 0x6e, 0x67, 0x49, 0x6e, 0x70, - 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x4e, 0x0a, 0x15, 0x69, 0x6e, 0x70, - 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, - 0x63, 0x68, 0x18, 0x07, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, - 0x6e, 0x63, 0x52, 0x15, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, - 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x27, 0x0a, 0x02, 0x68, 0x62, 0x18, - 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x48, - 0x65, 0x61, 0x72, 0x74, 0x62, 0x65, 0x61, 0x74, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x02, - 0x68, 0x62, 0x22, 0x89, 0x02, 0x0a, 0x06, 0x57, 0x73, 0x52, 0x65, 0x73, 0x70, 0x12, 0x10, 0x0a, - 0x03, 0x72, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x72, 0x65, 0x74, 0x12, - 0x20, 0x0a, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x65, 0x63, 0x68, 0x6f, 0x65, 0x64, 0x4d, 0x73, 0x67, 0x49, - 0x64, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x61, 0x63, 0x74, 0x12, 0x2b, 0x0a, 0x03, 0x72, 0x64, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, - 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x52, 0x03, 0x72, 0x64, 0x66, - 0x12, 0x54, 0x0a, 0x17, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, - 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x18, 0x05, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x49, 0x6e, 0x70, 0x75, 0x74, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x17, 0x69, - 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, - 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x12, 0x36, 0x0a, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, - 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, 0x65, 0x72, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x62, 0x63, 0x69, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x22, 0xe5, - 0x05, 0x0a, 0x0b, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x12, 0x24, - 0x0a, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x49, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x4c, 0x6f, 0x63, - 0x61, 0x6c, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x75, 0x70, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, - 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, - 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, - 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x30, 0x0a, 0x13, - 0x72, 0x65, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, - 0x48, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x13, 0x72, 0x65, 0x63, 0x6f, 0x76, - 0x65, 0x72, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x4f, 0x6e, 0x48, 0x69, 0x74, 0x12, 0x35, - 0x0a, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x52, 0x0b, 0x6d, 0x6f, 0x76, 0x65, 0x66, 0x6f, - 0x72, 0x77, 0x61, 0x72, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x4f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0c, 0x68, 0x69, 0x74, - 0x62, 0x6f, 0x78, 0x4f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x33, 0x0a, 0x0a, 0x68, 0x69, 0x74, - 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x73, 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, - 0x32, 0x44, 0x52, 0x0a, 0x68, 0x69, 0x74, 0x62, 0x6f, 0x78, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x38, - 0x0a, 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, - 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x17, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x52, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x24, 0x0a, 0x0d, 0x68, 0x69, 0x74, 0x53, - 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0d, 0x68, 0x69, 0x74, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, - 0x0a, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x53, 0x74, - 0x75, 0x6e, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x75, 0x73, 0x68, - 0x62, 0x61, 0x63, 0x6b, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x01, 0x52, 0x08, 0x70, 0x75, 0x73, 0x68, - 0x62, 0x61, 0x63, 0x6b, 0x12, 0x2e, 0x0a, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, - 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, 0x54, 0x79, 0x70, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x12, 0x72, 0x65, 0x6c, 0x65, 0x61, 0x73, 0x65, 0x54, 0x72, 0x69, 0x67, 0x67, 0x65, 0x72, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x0f, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x64, 0x61, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x2c, 0x0a, 0x11, - 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x10, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, - 0x72, 0x4a, 0x6f, 0x69, 0x6e, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x2a, 0x0a, 0x10, 0x6f, 0x66, - 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x18, 0x11, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x6f, 0x66, 0x66, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x50, 0x6c, - 0x61, 0x79, 0x65, 0x72, 0x49, 0x64, 0x22, 0x9a, 0x02, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, 0x44, - 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x07, - 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, - 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, - 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x26, - 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, - 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x37, 0x0a, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, - 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, - 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x1a, - 0x52, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, - 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x73, 0x72, - 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, + 0x69, 0x64, 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, + 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, + 0x74, 0x72, 0x79, 0x52, 0x15, 0x73, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, + 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x57, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, + 0x65, 0x57, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x67, 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, + 0x65, 0x74, 0x65, 0x48, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x67, + 0x65, 0x44, 0x69, 0x73, 0x63, 0x72, 0x65, 0x74, 0x65, 0x48, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x57, 0x12, 0x1e, 0x0a, 0x0a, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x54, 0x69, 0x6c, 0x65, 0x48, 0x12, 0x26, 0x0a, 0x0e, 0x69, 0x6e, + 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, 0x6e, 0x67, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0e, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x54, 0x6f, 0x50, 0x69, + 0x6e, 0x67, 0x12, 0x34, 0x0a, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, + 0x49, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x18, 0x09, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x15, 0x77, 0x69, 0x6c, 0x6c, 0x4b, 0x69, 0x63, 0x6b, 0x49, 0x66, 0x49, 0x6e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x46, 0x6f, 0x72, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6f, 0x75, 0x6e, + 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, + 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x6f, 0x6f, 0x6d, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x13, 0x62, 0x61, + 0x74, 0x74, 0x6c, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, + 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x62, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x44, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x1c, 0x0a, 0x09, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x46, 0x70, 0x73, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x46, 0x70, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0d, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x2a, 0x0a, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0d, + 0x52, 0x10, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x46, 0x72, 0x61, 0x6d, + 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x6e, 0x73, 0x74, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, + 0x61, 0x6d, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x6e, 0x73, 0x74, 0x44, + 0x65, 0x6c, 0x61, 0x79, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x1e, 0x69, 0x6e, + 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, + 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x10, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x1e, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x55, 0x70, + 0x73, 0x79, 0x6e, 0x63, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x54, 0x6f, 0x6c, 0x65, 0x72, 0x61, 0x6e, + 0x63, 0x65, 0x12, 0x48, 0x0a, 0x1f, 0x6d, 0x61, 0x78, 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, + 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1f, 0x6d, 0x61, 0x78, + 0x43, 0x68, 0x61, 0x73, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x46, 0x72, 0x61, + 0x6d, 0x65, 0x73, 0x50, 0x65, 0x72, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x12, 0x2c, 0x0a, 0x11, + 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x18, 0x12, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x42, + 0x61, 0x74, 0x74, 0x6c, 0x65, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3c, 0x0a, 0x19, 0x72, 0x6f, + 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, + 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x18, 0x13, 0x20, 0x01, 0x28, 0x01, 0x52, 0x19, 0x72, + 0x6f, 0x6c, 0x6c, 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, + 0x44, 0x74, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x12, 0x3a, 0x0a, 0x18, 0x72, 0x6f, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, + 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x14, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x72, 0x6f, 0x6c, 0x6c, + 0x62, 0x61, 0x63, 0x6b, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x44, 0x74, 0x4e, + 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x38, 0x0a, 0x17, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, + 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x18, + 0x15, 0x20, 0x01, 0x28, 0x01, 0x52, 0x17, 0x77, 0x6f, 0x72, 0x6c, 0x64, 0x54, 0x6f, 0x56, 0x69, + 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x38, + 0x0a, 0x17, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, + 0x6f, 0x72, 0x6c, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x16, 0x20, 0x01, 0x28, 0x01, 0x52, + 0x17, 0x76, 0x69, 0x72, 0x74, 0x75, 0x61, 0x6c, 0x47, 0x72, 0x69, 0x64, 0x54, 0x6f, 0x57, 0x6f, + 0x72, 0x6c, 0x64, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x2c, 0x0a, 0x11, 0x73, 0x70, 0x41, 0x74, + 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x17, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x11, 0x73, 0x70, 0x41, 0x74, 0x6b, 0x4c, 0x6f, 0x6f, 0x6b, 0x75, 0x70, + 0x46, 0x72, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x28, 0x0a, 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, + 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x18, 0x18, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0f, 0x72, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x43, 0x61, 0x63, 0x68, 0x65, 0x53, 0x69, 0x7a, 0x65, + 0x12, 0x5c, 0x0a, 0x10, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x18, 0x19, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x73, 0x2e, 0x42, 0x61, 0x74, 0x74, 0x6c, 0x65, 0x43, 0x6f, 0x6c, 0x6c, 0x69, 0x64, + 0x65, 0x72, 0x49, 0x6e, 0x66, 0x6f, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, 0x6c, + 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x6d, 0x65, + 0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x1a, 0x5d, + 0x0a, 0x16, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, + 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2d, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x73, 0x68, 0x61, 0x72, + 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x56, 0x65, 0x63, 0x32, 0x44, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x65, 0x0a, + 0x1a, 0x53, 0x74, 0x72, 0x54, 0x6f, 0x50, 0x6f, 0x6c, 0x79, 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, + 0x69, 0x73, 0x74, 0x4d, 0x61, 0x70, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x31, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x73, + 0x68, 0x61, 0x72, 0x65, 0x64, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x50, 0x6f, 0x6c, 0x79, + 0x67, 0x6f, 0x6e, 0x32, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x1a, 0x58, 0x0a, 0x15, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x53, 0x6b, 0x69, + 0x6c, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, + 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, + 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, + 0x6c, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x9a, + 0x02, 0x0a, 0x11, 0x52, 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, + 0x72, 0x61, 0x6d, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x40, 0x0a, 0x07, 0x70, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x52, + 0x6f, 0x6f, 0x6d, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, 0x46, 0x72, 0x61, 0x6d, 0x65, + 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x07, 0x70, + 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, + 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x4e, 0x61, 0x6e, 0x6f, 0x73, 0x12, 0x37, + 0x0a, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, 0x2e, 0x4d, 0x65, + 0x6c, 0x65, 0x65, 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x52, 0x0c, 0x6d, 0x65, 0x6c, 0x65, 0x65, + 0x42, 0x75, 0x6c, 0x6c, 0x65, 0x74, 0x73, 0x1a, 0x52, 0x0a, 0x0c, 0x50, 0x6c, 0x61, 0x79, 0x65, + 0x72, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2c, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x73, 0x2e, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x44, 0x6f, 0x77, 0x6e, 0x73, 0x79, 0x6e, 0x63, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x13, 0x5a, 0x11, 0x62, + 0x61, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x73, 0x72, 0x76, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x73, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1380,45 +1400,48 @@ func file_room_downsync_frame_proto_rawDescGZIP() []byte { return file_room_downsync_frame_proto_rawDescData } -var file_room_downsync_frame_proto_msgTypes = make([]protoimpl.MessageInfo, 13) +var file_room_downsync_frame_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_room_downsync_frame_proto_goTypes = []interface{}{ - (*BattleColliderInfo)(nil), // 0: protos.BattleColliderInfo - (*PlayerDownsync)(nil), // 1: protos.PlayerDownsync - (*InputFrameDecoded)(nil), // 2: protos.InputFrameDecoded - (*InputFrameUpsync)(nil), // 3: protos.InputFrameUpsync - (*InputFrameDownsync)(nil), // 4: protos.InputFrameDownsync - (*HeartbeatUpsync)(nil), // 5: protos.HeartbeatUpsync - (*WsReq)(nil), // 6: protos.WsReq - (*WsResp)(nil), // 7: protos.WsResp - (*MeleeBullet)(nil), // 8: protos.MeleeBullet + (*PlayerDownsync)(nil), // 0: protos.PlayerDownsync + (*InputFrameDecoded)(nil), // 1: protos.InputFrameDecoded + (*InputFrameUpsync)(nil), // 2: protos.InputFrameUpsync + (*InputFrameDownsync)(nil), // 3: protos.InputFrameDownsync + (*HeartbeatUpsync)(nil), // 4: protos.HeartbeatUpsync + (*WsReq)(nil), // 5: protos.WsReq + (*WsResp)(nil), // 6: protos.WsResp + (*MeleeBullet)(nil), // 7: protos.MeleeBullet + (*BattleColliderInfo)(nil), // 8: protos.BattleColliderInfo (*RoomDownsyncFrame)(nil), // 9: protos.RoomDownsyncFrame nil, // 10: protos.BattleColliderInfo.StrToVec2DListMapEntry nil, // 11: protos.BattleColliderInfo.StrToPolygon2DListMapEntry - nil, // 12: protos.RoomDownsyncFrame.PlayersEntry - (*sharedprotos.Vec2D)(nil), // 13: sharedprotos.Vec2D - (*sharedprotos.Vec2DList)(nil), // 14: sharedprotos.Vec2DList - (*sharedprotos.Polygon2DList)(nil), // 15: sharedprotos.Polygon2DList + nil, // 12: protos.BattleColliderInfo.MeleeSkillConfigEntry + nil, // 13: protos.RoomDownsyncFrame.PlayersEntry + (*sharedprotos.Vec2D)(nil), // 14: sharedprotos.Vec2D + (*sharedprotos.Vec2DList)(nil), // 15: sharedprotos.Vec2DList + (*sharedprotos.Polygon2DList)(nil), // 16: sharedprotos.Polygon2DList } var file_room_downsync_frame_proto_depIdxs = []int32{ - 10, // 0: protos.BattleColliderInfo.strToVec2DListMap:type_name -> protos.BattleColliderInfo.StrToVec2DListMapEntry - 11, // 1: protos.BattleColliderInfo.strToPolygon2DListMap:type_name -> protos.BattleColliderInfo.StrToPolygon2DListMapEntry - 3, // 2: protos.WsReq.inputFrameUpsyncBatch:type_name -> protos.InputFrameUpsync - 5, // 3: protos.WsReq.hb:type_name -> protos.HeartbeatUpsync - 9, // 4: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame - 4, // 5: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync - 0, // 6: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo - 13, // 7: protos.MeleeBullet.moveforward:type_name -> sharedprotos.Vec2D - 13, // 8: protos.MeleeBullet.hitboxSize:type_name -> sharedprotos.Vec2D - 12, // 9: protos.RoomDownsyncFrame.players:type_name -> protos.RoomDownsyncFrame.PlayersEntry - 8, // 10: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet - 14, // 11: protos.BattleColliderInfo.StrToVec2DListMapEntry.value:type_name -> sharedprotos.Vec2DList - 15, // 12: protos.BattleColliderInfo.StrToPolygon2DListMapEntry.value:type_name -> sharedprotos.Polygon2DList - 1, // 13: protos.RoomDownsyncFrame.PlayersEntry.value:type_name -> protos.PlayerDownsync - 14, // [14:14] is the sub-list for method output_type - 14, // [14:14] is the sub-list for method input_type - 14, // [14:14] is the sub-list for extension type_name - 14, // [14:14] is the sub-list for extension extendee - 0, // [0:14] is the sub-list for field type_name + 2, // 0: protos.WsReq.inputFrameUpsyncBatch:type_name -> protos.InputFrameUpsync + 4, // 1: protos.WsReq.hb:type_name -> protos.HeartbeatUpsync + 9, // 2: protos.WsResp.rdf:type_name -> protos.RoomDownsyncFrame + 3, // 3: protos.WsResp.inputFrameDownsyncBatch:type_name -> protos.InputFrameDownsync + 8, // 4: protos.WsResp.bciFrame:type_name -> protos.BattleColliderInfo + 14, // 5: protos.MeleeBullet.moveforward:type_name -> sharedprotos.Vec2D + 14, // 6: protos.MeleeBullet.hitboxSize:type_name -> sharedprotos.Vec2D + 10, // 7: protos.BattleColliderInfo.strToVec2DListMap:type_name -> protos.BattleColliderInfo.StrToVec2DListMapEntry + 11, // 8: protos.BattleColliderInfo.strToPolygon2DListMap:type_name -> protos.BattleColliderInfo.StrToPolygon2DListMapEntry + 12, // 9: protos.BattleColliderInfo.meleeSkillConfig:type_name -> protos.BattleColliderInfo.MeleeSkillConfigEntry + 13, // 10: protos.RoomDownsyncFrame.players:type_name -> protos.RoomDownsyncFrame.PlayersEntry + 7, // 11: protos.RoomDownsyncFrame.meleeBullets:type_name -> protos.MeleeBullet + 15, // 12: protos.BattleColliderInfo.StrToVec2DListMapEntry.value:type_name -> sharedprotos.Vec2DList + 16, // 13: protos.BattleColliderInfo.StrToPolygon2DListMapEntry.value:type_name -> sharedprotos.Polygon2DList + 7, // 14: protos.BattleColliderInfo.MeleeSkillConfigEntry.value:type_name -> protos.MeleeBullet + 0, // 15: protos.RoomDownsyncFrame.PlayersEntry.value:type_name -> protos.PlayerDownsync + 16, // [16:16] is the sub-list for method output_type + 16, // [16:16] is the sub-list for method input_type + 16, // [16:16] is the sub-list for extension type_name + 16, // [16:16] is the sub-list for extension extendee + 0, // [0:16] is the sub-list for field type_name } func init() { file_room_downsync_frame_proto_init() } @@ -1428,18 +1451,6 @@ func file_room_downsync_frame_proto_init() { } if !protoimpl.UnsafeEnabled { file_room_downsync_frame_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BattleColliderInfo); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_room_downsync_frame_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*PlayerDownsync); i { case 0: return &v.state @@ -1451,7 +1462,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InputFrameDecoded); i { case 0: return &v.state @@ -1463,7 +1474,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InputFrameUpsync); i { case 0: return &v.state @@ -1475,7 +1486,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*InputFrameDownsync); i { case 0: return &v.state @@ -1487,7 +1498,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*HeartbeatUpsync); i { case 0: return &v.state @@ -1499,7 +1510,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WsReq); i { case 0: return &v.state @@ -1511,7 +1522,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*WsResp); i { case 0: return &v.state @@ -1523,7 +1534,7 @@ func file_room_downsync_frame_proto_init() { return nil } } - file_room_downsync_frame_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + file_room_downsync_frame_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*MeleeBullet); i { case 0: return &v.state @@ -1535,6 +1546,18 @@ func file_room_downsync_frame_proto_init() { return nil } } + file_room_downsync_frame_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*BattleColliderInfo); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } file_room_downsync_frame_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*RoomDownsyncFrame); i { case 0: @@ -1554,7 +1577,7 @@ func file_room_downsync_frame_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_room_downsync_frame_proto_rawDesc, NumEnums: 0, - NumMessages: 13, + NumMessages: 14, NumExtensions: 0, NumServices: 0, }, diff --git a/dnmshared/resolv_helper.go b/dnmshared/resolv_helper.go index 306d654..b534eb7 100644 --- a/dnmshared/resolv_helper.go +++ b/dnmshared/resolv_helper.go @@ -20,6 +20,10 @@ func ConvexPolygonStr(body *resolv.ConvexPolygon) string { func GenerateRectCollider(origX, origY, w, h, spaceOffsetX, spaceOffsetY float64, tag string) *resolv.Object { cx, cy := WorldToPolygonColliderAnchorPos(origX, origY, w*0.5, h*0.5, spaceOffsetX, spaceOffsetY) + return GenerateRectColliderInCollisionSpace(cx, cy, w, h, tag) +} + +func GenerateRectColliderInCollisionSpace(cx, cy, w, h float64, tag string) *resolv.Object { collider := resolv.NewObject(cx, cy, w, h, tag) shape := resolv.NewRectangle(0, 0, w, h) collider.SetShape(shape) diff --git a/frontend/assets/resources/pbfiles/room_downsync_frame.proto b/frontend/assets/resources/pbfiles/room_downsync_frame.proto index ca476a8..6471551 100644 --- a/frontend/assets/resources/pbfiles/room_downsync_frame.proto +++ b/frontend/assets/resources/pbfiles/room_downsync_frame.proto @@ -4,36 +4,6 @@ option go_package = "battle_srv/protos"; // here "./" corresponds to the "--go_o package protos; import "geometry.proto"; // The import path here is only w.r.t. the proto file, not the Go package. -message BattleColliderInfo { - string stageName = 1; - map strToVec2DListMap = 2; - map strToPolygon2DListMap = 3; - int32 stageDiscreteW = 4; - int32 stageDiscreteH = 5; - int32 stageTileW = 6; - int32 stageTileH = 7; - - int32 intervalToPing = 8; - int32 willKickIfInactiveFor = 9; - int32 boundRoomId = 10; - int64 battleDurationNanos = 11; - int32 serverFps = 12; - int32 inputDelayFrames = 13; - uint32 inputScaleFrames = 14; - int32 nstDelayFrames = 15; - int32 inputFrameUpsyncDelayTolerance = 16; - int32 maxChasingRenderFramesPerUpdate = 17; - int32 playerBattleState = 18; - double rollbackEstimatedDtMillis = 19; - int64 rollbackEstimatedDtNanos = 20; - - double worldToVirtualGridRatio = 21; - double virtualGridToWorldRatio = 22; - - int32 spAtkLookupFrames = 23; - int32 renderCacheSize = 24; -} - message PlayerDownsync { int32 id = 1; int32 virtualGridX = 2; @@ -126,6 +96,38 @@ message MeleeBullet { int32 offenderPlayerId = 17; } +message BattleColliderInfo { + string stageName = 1; + map strToVec2DListMap = 2; + map strToPolygon2DListMap = 3; + int32 stageDiscreteW = 4; + int32 stageDiscreteH = 5; + int32 stageTileW = 6; + int32 stageTileH = 7; + + int32 intervalToPing = 8; + int32 willKickIfInactiveFor = 9; + int32 boundRoomId = 10; + int64 battleDurationNanos = 11; + int32 serverFps = 12; + int32 inputDelayFrames = 13; + uint32 inputScaleFrames = 14; + int32 nstDelayFrames = 15; + int32 inputFrameUpsyncDelayTolerance = 16; + int32 maxChasingRenderFramesPerUpdate = 17; + int32 playerBattleState = 18; + double rollbackEstimatedDtMillis = 19; + int64 rollbackEstimatedDtNanos = 20; + + double worldToVirtualGridRatio = 21; + double virtualGridToWorldRatio = 22; + + int32 spAtkLookupFrames = 23; + int32 renderCacheSize = 24; + + map meleeSkillConfig = 25; // skillId -> skill +} + message RoomDownsyncFrame { int32 id = 1; map players = 2; diff --git a/frontend/assets/scenes/default_map.fire b/frontend/assets/scenes/default_map.fire index f324ed5..547ef92 100644 --- a/frontend/assets/scenes/default_map.fire +++ b/frontend/assets/scenes/default_map.fire @@ -343,6 +343,7 @@ "forceBigEndianFloatingNumDecoding": false, "renderFrameIdLagTolerance": 4, "jigglingEps1D": 0.001, + "bulletTriggerEnabled": true, "_id": "d12gkAmppNlIzqcRDELa91" }, { @@ -522,7 +523,7 @@ "array": [ 0, 0, - 239.32248305180272, + 210.23252687912068, 0, 0, 0, @@ -1482,7 +1483,6 @@ "zoomingListenerNode": { "__id__": 5 }, - "actionBtnListenerNode": null, "stickhead": { "__id__": 25 }, diff --git a/frontend/assets/scenes/login.fire b/frontend/assets/scenes/login.fire index 5cbb696..2818e90 100644 --- a/frontend/assets/scenes/login.fire +++ b/frontend/assets/scenes/login.fire @@ -440,7 +440,7 @@ "array": [ 0, 0, - 210.4441731196186, + 210.23252687912068, 0, 0, 0, diff --git a/frontend/assets/scenes/offline_map_1.fire b/frontend/assets/scenes/offline_map_1.fire index 0ac0a62..b579327 100644 --- a/frontend/assets/scenes/offline_map_1.fire +++ b/frontend/assets/scenes/offline_map_1.fire @@ -454,7 +454,7 @@ "array": [ 0, 0, - 210.4441731196186, + 210.23252687912068, 0, 0, 0, diff --git a/frontend/assets/scripts/Map.js b/frontend/assets/scripts/Map.js index 8cf2031..d53c2b7 100644 --- a/frontend/assets/scripts/Map.js +++ b/frontend/assets/scripts/Map.js @@ -1085,18 +1085,23 @@ cc.Class({ bulletColliders.forEach((bulletCollider, collisionBulletIndex) => { const potentials = bulletCollider.potentials(); + const offender = currRenderFrame.players[bulletCollider.data.offenderPlayerId]; let shouldRemove = false; for (const potential of potentials) { if (null != potential.data && potential.data.joinIndex == bulletCollider.data.offenderJoinIndex) continue; if (!bulletCollider.collides(potential, result1)) continue; if (null != potential.data && null !== potential.data.joinIndex) { const joinIndex = potential.data.joinIndex; - bulletPushbacks[joinIndex - 1][0] += bulletCollider.data.pushback; // Only for straight punch, there's no y-pushback + let xfac = 1; + if (0 > offender.dirX) { + xfac = -1; + } + bulletPushbacks[joinIndex - 1][0] += xfac * bulletCollider.data.pushback; // Only for straight punch, there's no y-pushback bulletPushbacks[joinIndex - 1][1] += 0; const thatAckedPlayerInNextFrame = nextRenderFramePlayers[potential.data.id]; thatAckedPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atked1[0]; - const oldFrameToRecover = thatAckedPlayerInNextFrame.framesToRecover; - thatAckedPlayerInNextFrame.framesToRecover = (oldFrameToRecover > bulletCollider.data.hitStunFrames ? oldFrameToRecover : bulletCollider.data.hitStunFrames); // In case the hit player is already stun, we extend it + const oldFramesToRecover = thatAckedPlayerInNextFrame.framesToRecover; + thatAckedPlayerInNextFrame.framesToRecover = (oldFramesToRecover > bulletCollider.data.hitStunFrames ? oldFramesToRecover : bulletCollider.data.hitStunFrames); // In case the hit player is already stun, we extend it } shouldRemove = true; } @@ -1156,14 +1161,14 @@ cc.Class({ punch.offenderPlayerId = playerId; punch.originatedRenderFrameId = currRenderFrame.id; toRet.meleeBullets.push(punch); - console.log(`A rising-edge of meleeBullet is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}: ${JSON.stringify(punch)}`); + console.log(`A rising-edge of meleeBullet is created at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}: ${self._stringifyRecentInputCache(true)}`); thatPlayerInNextFrame.characterState = window.ATK_CHARACTER_STATE.Atk1[0]; } } else if (0 == decodedInput.btnALevel && 1 == prevBtnALevel) { // console.log(`playerId=${playerId} triggered a falling-edge of btnA at renderFrame.id=${currRenderFrame.id}, delayedInputFrame.id=${delayedInputFrame.inputFrameId}`); } else { - // No trigger, process movement inputs + // No bullet trigger, process movement inputs if (0 != decodedInput.dx || 0 != decodedInput.dy) { // Update directions and thus would eventually update moving animation accordingly thatPlayerInNextFrame.dirX = decodedInput.dx; diff --git a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js index c42318d..210dfea 100644 --- a/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js +++ b/frontend/assets/scripts/modules/room_downsync_frame_proto_bundle.forcemsg.js @@ -1185,852 +1185,6 @@ $root.protos = (function() { */ var protos = {}; - protos.BattleColliderInfo = (function() { - - /** - * Properties of a BattleColliderInfo. - * @memberof protos - * @interface IBattleColliderInfo - * @property {string|null} [stageName] BattleColliderInfo stageName - * @property {Object.|null} [strToVec2DListMap] BattleColliderInfo strToVec2DListMap - * @property {Object.|null} [strToPolygon2DListMap] BattleColliderInfo strToPolygon2DListMap - * @property {number|null} [stageDiscreteW] BattleColliderInfo stageDiscreteW - * @property {number|null} [stageDiscreteH] BattleColliderInfo stageDiscreteH - * @property {number|null} [stageTileW] BattleColliderInfo stageTileW - * @property {number|null} [stageTileH] BattleColliderInfo stageTileH - * @property {number|null} [intervalToPing] BattleColliderInfo intervalToPing - * @property {number|null} [willKickIfInactiveFor] BattleColliderInfo willKickIfInactiveFor - * @property {number|null} [boundRoomId] BattleColliderInfo boundRoomId - * @property {number|Long|null} [battleDurationNanos] BattleColliderInfo battleDurationNanos - * @property {number|null} [serverFps] BattleColliderInfo serverFps - * @property {number|null} [inputDelayFrames] BattleColliderInfo inputDelayFrames - * @property {number|null} [inputScaleFrames] BattleColliderInfo inputScaleFrames - * @property {number|null} [nstDelayFrames] BattleColliderInfo nstDelayFrames - * @property {number|null} [inputFrameUpsyncDelayTolerance] BattleColliderInfo inputFrameUpsyncDelayTolerance - * @property {number|null} [maxChasingRenderFramesPerUpdate] BattleColliderInfo maxChasingRenderFramesPerUpdate - * @property {number|null} [playerBattleState] BattleColliderInfo playerBattleState - * @property {number|null} [rollbackEstimatedDtMillis] BattleColliderInfo rollbackEstimatedDtMillis - * @property {number|Long|null} [rollbackEstimatedDtNanos] BattleColliderInfo rollbackEstimatedDtNanos - * @property {number|null} [worldToVirtualGridRatio] BattleColliderInfo worldToVirtualGridRatio - * @property {number|null} [virtualGridToWorldRatio] BattleColliderInfo virtualGridToWorldRatio - * @property {number|null} [spAtkLookupFrames] BattleColliderInfo spAtkLookupFrames - * @property {number|null} [renderCacheSize] BattleColliderInfo renderCacheSize - */ - - /** - * Constructs a new BattleColliderInfo. - * @memberof protos - * @classdesc Represents a BattleColliderInfo. - * @implements IBattleColliderInfo - * @constructor - * @param {protos.IBattleColliderInfo=} [properties] Properties to set - */ - function BattleColliderInfo(properties) { - this.strToVec2DListMap = {}; - this.strToPolygon2DListMap = {}; - if (properties) - for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) - if (properties[keys[i]] != null) - this[keys[i]] = properties[keys[i]]; - } - - /** - * BattleColliderInfo stageName. - * @member {string} stageName - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageName = ""; - - /** - * BattleColliderInfo strToVec2DListMap. - * @member {Object.} strToVec2DListMap - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.strToVec2DListMap = $util.emptyObject; - - /** - * BattleColliderInfo strToPolygon2DListMap. - * @member {Object.} strToPolygon2DListMap - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.strToPolygon2DListMap = $util.emptyObject; - - /** - * BattleColliderInfo stageDiscreteW. - * @member {number} stageDiscreteW - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageDiscreteW = 0; - - /** - * BattleColliderInfo stageDiscreteH. - * @member {number} stageDiscreteH - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageDiscreteH = 0; - - /** - * BattleColliderInfo stageTileW. - * @member {number} stageTileW - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageTileW = 0; - - /** - * BattleColliderInfo stageTileH. - * @member {number} stageTileH - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.stageTileH = 0; - - /** - * BattleColliderInfo intervalToPing. - * @member {number} intervalToPing - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.intervalToPing = 0; - - /** - * BattleColliderInfo willKickIfInactiveFor. - * @member {number} willKickIfInactiveFor - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.willKickIfInactiveFor = 0; - - /** - * BattleColliderInfo boundRoomId. - * @member {number} boundRoomId - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.boundRoomId = 0; - - /** - * BattleColliderInfo battleDurationNanos. - * @member {number|Long} battleDurationNanos - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.battleDurationNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; - - /** - * BattleColliderInfo serverFps. - * @member {number} serverFps - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.serverFps = 0; - - /** - * BattleColliderInfo inputDelayFrames. - * @member {number} inputDelayFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.inputDelayFrames = 0; - - /** - * BattleColliderInfo inputScaleFrames. - * @member {number} inputScaleFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.inputScaleFrames = 0; - - /** - * BattleColliderInfo nstDelayFrames. - * @member {number} nstDelayFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.nstDelayFrames = 0; - - /** - * BattleColliderInfo inputFrameUpsyncDelayTolerance. - * @member {number} inputFrameUpsyncDelayTolerance - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.inputFrameUpsyncDelayTolerance = 0; - - /** - * BattleColliderInfo maxChasingRenderFramesPerUpdate. - * @member {number} maxChasingRenderFramesPerUpdate - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.maxChasingRenderFramesPerUpdate = 0; - - /** - * BattleColliderInfo playerBattleState. - * @member {number} playerBattleState - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.playerBattleState = 0; - - /** - * BattleColliderInfo rollbackEstimatedDtMillis. - * @member {number} rollbackEstimatedDtMillis - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.rollbackEstimatedDtMillis = 0; - - /** - * BattleColliderInfo rollbackEstimatedDtNanos. - * @member {number|Long} rollbackEstimatedDtNanos - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.rollbackEstimatedDtNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; - - /** - * BattleColliderInfo worldToVirtualGridRatio. - * @member {number} worldToVirtualGridRatio - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.worldToVirtualGridRatio = 0; - - /** - * BattleColliderInfo virtualGridToWorldRatio. - * @member {number} virtualGridToWorldRatio - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.virtualGridToWorldRatio = 0; - - /** - * BattleColliderInfo spAtkLookupFrames. - * @member {number} spAtkLookupFrames - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.spAtkLookupFrames = 0; - - /** - * BattleColliderInfo renderCacheSize. - * @member {number} renderCacheSize - * @memberof protos.BattleColliderInfo - * @instance - */ - BattleColliderInfo.prototype.renderCacheSize = 0; - - /** - * Creates a new BattleColliderInfo instance using the specified properties. - * @function create - * @memberof protos.BattleColliderInfo - * @static - * @param {protos.IBattleColliderInfo=} [properties] Properties to set - * @returns {protos.BattleColliderInfo} BattleColliderInfo instance - */ - BattleColliderInfo.create = function create(properties) { - return new BattleColliderInfo(properties); - }; - - /** - * Encodes the specified BattleColliderInfo message. Does not implicitly {@link protos.BattleColliderInfo.verify|verify} messages. - * @function encode - * @memberof protos.BattleColliderInfo - * @static - * @param {protos.BattleColliderInfo} message BattleColliderInfo message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - BattleColliderInfo.encode = function encode(message, writer) { - if (!writer) - writer = $Writer.create(); - if (message.stageName != null && Object.hasOwnProperty.call(message, "stageName")) - writer.uint32(/* id 1, wireType 2 =*/10).string(message.stageName); - if (message.strToVec2DListMap != null && Object.hasOwnProperty.call(message, "strToVec2DListMap")) - for (var keys = Object.keys(message.strToVec2DListMap), i = 0; i < keys.length; ++i) { - writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); - $root.sharedprotos.Vec2DList.encode(message.strToVec2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); - } - if (message.strToPolygon2DListMap != null && Object.hasOwnProperty.call(message, "strToPolygon2DListMap")) - for (var keys = Object.keys(message.strToPolygon2DListMap), i = 0; i < keys.length; ++i) { - writer.uint32(/* id 3, wireType 2 =*/26).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); - $root.sharedprotos.Polygon2DList.encode(message.strToPolygon2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); - } - if (message.stageDiscreteW != null && Object.hasOwnProperty.call(message, "stageDiscreteW")) - writer.uint32(/* id 4, wireType 0 =*/32).int32(message.stageDiscreteW); - if (message.stageDiscreteH != null && Object.hasOwnProperty.call(message, "stageDiscreteH")) - writer.uint32(/* id 5, wireType 0 =*/40).int32(message.stageDiscreteH); - if (message.stageTileW != null && Object.hasOwnProperty.call(message, "stageTileW")) - writer.uint32(/* id 6, wireType 0 =*/48).int32(message.stageTileW); - if (message.stageTileH != null && Object.hasOwnProperty.call(message, "stageTileH")) - writer.uint32(/* id 7, wireType 0 =*/56).int32(message.stageTileH); - if (message.intervalToPing != null && Object.hasOwnProperty.call(message, "intervalToPing")) - writer.uint32(/* id 8, wireType 0 =*/64).int32(message.intervalToPing); - if (message.willKickIfInactiveFor != null && Object.hasOwnProperty.call(message, "willKickIfInactiveFor")) - writer.uint32(/* id 9, wireType 0 =*/72).int32(message.willKickIfInactiveFor); - if (message.boundRoomId != null && Object.hasOwnProperty.call(message, "boundRoomId")) - writer.uint32(/* id 10, wireType 0 =*/80).int32(message.boundRoomId); - if (message.battleDurationNanos != null && Object.hasOwnProperty.call(message, "battleDurationNanos")) - writer.uint32(/* id 11, wireType 0 =*/88).int64(message.battleDurationNanos); - if (message.serverFps != null && Object.hasOwnProperty.call(message, "serverFps")) - writer.uint32(/* id 12, wireType 0 =*/96).int32(message.serverFps); - if (message.inputDelayFrames != null && Object.hasOwnProperty.call(message, "inputDelayFrames")) - writer.uint32(/* id 13, wireType 0 =*/104).int32(message.inputDelayFrames); - if (message.inputScaleFrames != null && Object.hasOwnProperty.call(message, "inputScaleFrames")) - writer.uint32(/* id 14, wireType 0 =*/112).uint32(message.inputScaleFrames); - if (message.nstDelayFrames != null && Object.hasOwnProperty.call(message, "nstDelayFrames")) - writer.uint32(/* id 15, wireType 0 =*/120).int32(message.nstDelayFrames); - if (message.inputFrameUpsyncDelayTolerance != null && Object.hasOwnProperty.call(message, "inputFrameUpsyncDelayTolerance")) - writer.uint32(/* id 16, wireType 0 =*/128).int32(message.inputFrameUpsyncDelayTolerance); - if (message.maxChasingRenderFramesPerUpdate != null && Object.hasOwnProperty.call(message, "maxChasingRenderFramesPerUpdate")) - writer.uint32(/* id 17, wireType 0 =*/136).int32(message.maxChasingRenderFramesPerUpdate); - if (message.playerBattleState != null && Object.hasOwnProperty.call(message, "playerBattleState")) - writer.uint32(/* id 18, wireType 0 =*/144).int32(message.playerBattleState); - if (message.rollbackEstimatedDtMillis != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtMillis")) - writer.uint32(/* id 19, wireType 1 =*/153).double(message.rollbackEstimatedDtMillis); - if (message.rollbackEstimatedDtNanos != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtNanos")) - writer.uint32(/* id 20, wireType 0 =*/160).int64(message.rollbackEstimatedDtNanos); - if (message.worldToVirtualGridRatio != null && Object.hasOwnProperty.call(message, "worldToVirtualGridRatio")) - writer.uint32(/* id 21, wireType 1 =*/169).double(message.worldToVirtualGridRatio); - if (message.virtualGridToWorldRatio != null && Object.hasOwnProperty.call(message, "virtualGridToWorldRatio")) - writer.uint32(/* id 22, wireType 1 =*/177).double(message.virtualGridToWorldRatio); - if (message.spAtkLookupFrames != null && Object.hasOwnProperty.call(message, "spAtkLookupFrames")) - writer.uint32(/* id 23, wireType 0 =*/184).int32(message.spAtkLookupFrames); - if (message.renderCacheSize != null && Object.hasOwnProperty.call(message, "renderCacheSize")) - writer.uint32(/* id 24, wireType 0 =*/192).int32(message.renderCacheSize); - return writer; - }; - - /** - * Encodes the specified BattleColliderInfo message, length delimited. Does not implicitly {@link protos.BattleColliderInfo.verify|verify} messages. - * @function encodeDelimited - * @memberof protos.BattleColliderInfo - * @static - * @param {protos.BattleColliderInfo} message BattleColliderInfo message or plain object to encode - * @param {$protobuf.Writer} [writer] Writer to encode to - * @returns {$protobuf.Writer} Writer - */ - BattleColliderInfo.encodeDelimited = function encodeDelimited(message, writer) { - return this.encode(message, writer).ldelim(); - }; - - /** - * Decodes a BattleColliderInfo message from the specified reader or buffer. - * @function decode - * @memberof protos.BattleColliderInfo - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @param {number} [length] Message length if known beforehand - * @returns {protos.BattleColliderInfo} BattleColliderInfo - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - BattleColliderInfo.decode = function decode(reader, length) { - if (!(reader instanceof $Reader)) - reader = $Reader.create(reader); - var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.BattleColliderInfo(), key, value; - while (reader.pos < end) { - var tag = reader.uint32(); - switch (tag >>> 3) { - case 1: { - message.stageName = reader.string(); - break; - } - case 2: { - if (message.strToVec2DListMap === $util.emptyObject) - message.strToVec2DListMap = {}; - var end2 = reader.uint32() + reader.pos; - key = ""; - value = null; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.string(); - break; - case 2: - value = $root.sharedprotos.Vec2DList.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag2 & 7); - break; - } - } - message.strToVec2DListMap[key] = value; - break; - } - case 3: { - if (message.strToPolygon2DListMap === $util.emptyObject) - message.strToPolygon2DListMap = {}; - var end2 = reader.uint32() + reader.pos; - key = ""; - value = null; - while (reader.pos < end2) { - var tag2 = reader.uint32(); - switch (tag2 >>> 3) { - case 1: - key = reader.string(); - break; - case 2: - value = $root.sharedprotos.Polygon2DList.decode(reader, reader.uint32()); - break; - default: - reader.skipType(tag2 & 7); - break; - } - } - message.strToPolygon2DListMap[key] = value; - break; - } - case 4: { - message.stageDiscreteW = reader.int32(); - break; - } - case 5: { - message.stageDiscreteH = reader.int32(); - break; - } - case 6: { - message.stageTileW = reader.int32(); - break; - } - case 7: { - message.stageTileH = reader.int32(); - break; - } - case 8: { - message.intervalToPing = reader.int32(); - break; - } - case 9: { - message.willKickIfInactiveFor = reader.int32(); - break; - } - case 10: { - message.boundRoomId = reader.int32(); - break; - } - case 11: { - message.battleDurationNanos = reader.int64(); - break; - } - case 12: { - message.serverFps = reader.int32(); - break; - } - case 13: { - message.inputDelayFrames = reader.int32(); - break; - } - case 14: { - message.inputScaleFrames = reader.uint32(); - break; - } - case 15: { - message.nstDelayFrames = reader.int32(); - break; - } - case 16: { - message.inputFrameUpsyncDelayTolerance = reader.int32(); - break; - } - case 17: { - message.maxChasingRenderFramesPerUpdate = reader.int32(); - break; - } - case 18: { - message.playerBattleState = reader.int32(); - break; - } - case 19: { - message.rollbackEstimatedDtMillis = reader.double(); - break; - } - case 20: { - message.rollbackEstimatedDtNanos = reader.int64(); - break; - } - case 21: { - message.worldToVirtualGridRatio = reader.double(); - break; - } - case 22: { - message.virtualGridToWorldRatio = reader.double(); - break; - } - case 23: { - message.spAtkLookupFrames = reader.int32(); - break; - } - case 24: { - message.renderCacheSize = reader.int32(); - break; - } - default: - reader.skipType(tag & 7); - break; - } - } - return message; - }; - - /** - * Decodes a BattleColliderInfo message from the specified reader or buffer, length delimited. - * @function decodeDelimited - * @memberof protos.BattleColliderInfo - * @static - * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from - * @returns {protos.BattleColliderInfo} BattleColliderInfo - * @throws {Error} If the payload is not a reader or valid buffer - * @throws {$protobuf.util.ProtocolError} If required fields are missing - */ - BattleColliderInfo.decodeDelimited = function decodeDelimited(reader) { - if (!(reader instanceof $Reader)) - reader = new $Reader(reader); - return this.decode(reader, reader.uint32()); - }; - - /** - * Verifies a BattleColliderInfo message. - * @function verify - * @memberof protos.BattleColliderInfo - * @static - * @param {Object.} message Plain object to verify - * @returns {string|null} `null` if valid, otherwise the reason why it is not - */ - BattleColliderInfo.verify = function verify(message) { - if (typeof message !== "object" || message === null) - return "object expected"; - if (message.stageName != null && message.hasOwnProperty("stageName")) - if (!$util.isString(message.stageName)) - return "stageName: string expected"; - if (message.strToVec2DListMap != null && message.hasOwnProperty("strToVec2DListMap")) { - if (!$util.isObject(message.strToVec2DListMap)) - return "strToVec2DListMap: object expected"; - var key = Object.keys(message.strToVec2DListMap); - for (var i = 0; i < key.length; ++i) { - var error = $root.sharedprotos.Vec2DList.verify(message.strToVec2DListMap[key[i]]); - if (error) - return "strToVec2DListMap." + error; - } - } - if (message.strToPolygon2DListMap != null && message.hasOwnProperty("strToPolygon2DListMap")) { - if (!$util.isObject(message.strToPolygon2DListMap)) - return "strToPolygon2DListMap: object expected"; - var key = Object.keys(message.strToPolygon2DListMap); - for (var i = 0; i < key.length; ++i) { - var error = $root.sharedprotos.Polygon2DList.verify(message.strToPolygon2DListMap[key[i]]); - if (error) - return "strToPolygon2DListMap." + error; - } - } - if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) - if (!$util.isInteger(message.stageDiscreteW)) - return "stageDiscreteW: integer expected"; - if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) - if (!$util.isInteger(message.stageDiscreteH)) - return "stageDiscreteH: integer expected"; - if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) - if (!$util.isInteger(message.stageTileW)) - return "stageTileW: integer expected"; - if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) - if (!$util.isInteger(message.stageTileH)) - return "stageTileH: integer expected"; - if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) - if (!$util.isInteger(message.intervalToPing)) - return "intervalToPing: integer expected"; - if (message.willKickIfInactiveFor != null && message.hasOwnProperty("willKickIfInactiveFor")) - if (!$util.isInteger(message.willKickIfInactiveFor)) - return "willKickIfInactiveFor: integer expected"; - if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) - if (!$util.isInteger(message.boundRoomId)) - return "boundRoomId: integer expected"; - if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) - if (!$util.isInteger(message.battleDurationNanos) && !(message.battleDurationNanos && $util.isInteger(message.battleDurationNanos.low) && $util.isInteger(message.battleDurationNanos.high))) - return "battleDurationNanos: integer|Long expected"; - if (message.serverFps != null && message.hasOwnProperty("serverFps")) - if (!$util.isInteger(message.serverFps)) - return "serverFps: integer expected"; - if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) - if (!$util.isInteger(message.inputDelayFrames)) - return "inputDelayFrames: integer expected"; - if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) - if (!$util.isInteger(message.inputScaleFrames)) - return "inputScaleFrames: integer expected"; - if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) - if (!$util.isInteger(message.nstDelayFrames)) - return "nstDelayFrames: integer expected"; - if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) - if (!$util.isInteger(message.inputFrameUpsyncDelayTolerance)) - return "inputFrameUpsyncDelayTolerance: integer expected"; - if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) - if (!$util.isInteger(message.maxChasingRenderFramesPerUpdate)) - return "maxChasingRenderFramesPerUpdate: integer expected"; - if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) - if (!$util.isInteger(message.playerBattleState)) - return "playerBattleState: integer expected"; - if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) - if (typeof message.rollbackEstimatedDtMillis !== "number") - return "rollbackEstimatedDtMillis: number expected"; - if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) - if (!$util.isInteger(message.rollbackEstimatedDtNanos) && !(message.rollbackEstimatedDtNanos && $util.isInteger(message.rollbackEstimatedDtNanos.low) && $util.isInteger(message.rollbackEstimatedDtNanos.high))) - return "rollbackEstimatedDtNanos: integer|Long expected"; - if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) - if (typeof message.worldToVirtualGridRatio !== "number") - return "worldToVirtualGridRatio: number expected"; - if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) - if (typeof message.virtualGridToWorldRatio !== "number") - return "virtualGridToWorldRatio: number expected"; - if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) - if (!$util.isInteger(message.spAtkLookupFrames)) - return "spAtkLookupFrames: integer expected"; - if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) - if (!$util.isInteger(message.renderCacheSize)) - return "renderCacheSize: integer expected"; - return null; - }; - - /** - * Creates a BattleColliderInfo message from a plain object. Also converts values to their respective internal types. - * @function fromObject - * @memberof protos.BattleColliderInfo - * @static - * @param {Object.} object Plain object - * @returns {protos.BattleColliderInfo} BattleColliderInfo - */ - BattleColliderInfo.fromObject = function fromObject(object) { - if (object instanceof $root.protos.BattleColliderInfo) - return object; - var message = new $root.protos.BattleColliderInfo(); - if (object.stageName != null) - message.stageName = String(object.stageName); - if (object.strToVec2DListMap) { - if (typeof object.strToVec2DListMap !== "object") - throw TypeError(".protos.BattleColliderInfo.strToVec2DListMap: object expected"); - message.strToVec2DListMap = {}; - for (var keys = Object.keys(object.strToVec2DListMap), i = 0; i < keys.length; ++i) { - if (typeof object.strToVec2DListMap[keys[i]] !== "object") - throw TypeError(".protos.BattleColliderInfo.strToVec2DListMap: object expected"); - message.strToVec2DListMap[keys[i]] = $root.sharedprotos.Vec2DList.fromObject(object.strToVec2DListMap[keys[i]]); - } - } - if (object.strToPolygon2DListMap) { - if (typeof object.strToPolygon2DListMap !== "object") - throw TypeError(".protos.BattleColliderInfo.strToPolygon2DListMap: object expected"); - message.strToPolygon2DListMap = {}; - for (var keys = Object.keys(object.strToPolygon2DListMap), i = 0; i < keys.length; ++i) { - if (typeof object.strToPolygon2DListMap[keys[i]] !== "object") - throw TypeError(".protos.BattleColliderInfo.strToPolygon2DListMap: object expected"); - message.strToPolygon2DListMap[keys[i]] = $root.sharedprotos.Polygon2DList.fromObject(object.strToPolygon2DListMap[keys[i]]); - } - } - if (object.stageDiscreteW != null) - message.stageDiscreteW = object.stageDiscreteW | 0; - if (object.stageDiscreteH != null) - message.stageDiscreteH = object.stageDiscreteH | 0; - if (object.stageTileW != null) - message.stageTileW = object.stageTileW | 0; - if (object.stageTileH != null) - message.stageTileH = object.stageTileH | 0; - if (object.intervalToPing != null) - message.intervalToPing = object.intervalToPing | 0; - if (object.willKickIfInactiveFor != null) - message.willKickIfInactiveFor = object.willKickIfInactiveFor | 0; - if (object.boundRoomId != null) - message.boundRoomId = object.boundRoomId | 0; - if (object.battleDurationNanos != null) - if ($util.Long) - (message.battleDurationNanos = $util.Long.fromValue(object.battleDurationNanos)).unsigned = false; - else if (typeof object.battleDurationNanos === "string") - message.battleDurationNanos = parseInt(object.battleDurationNanos, 10); - else if (typeof object.battleDurationNanos === "number") - message.battleDurationNanos = object.battleDurationNanos; - else if (typeof object.battleDurationNanos === "object") - message.battleDurationNanos = new $util.LongBits(object.battleDurationNanos.low >>> 0, object.battleDurationNanos.high >>> 0).toNumber(); - if (object.serverFps != null) - message.serverFps = object.serverFps | 0; - if (object.inputDelayFrames != null) - message.inputDelayFrames = object.inputDelayFrames | 0; - if (object.inputScaleFrames != null) - message.inputScaleFrames = object.inputScaleFrames >>> 0; - if (object.nstDelayFrames != null) - message.nstDelayFrames = object.nstDelayFrames | 0; - if (object.inputFrameUpsyncDelayTolerance != null) - message.inputFrameUpsyncDelayTolerance = object.inputFrameUpsyncDelayTolerance | 0; - if (object.maxChasingRenderFramesPerUpdate != null) - message.maxChasingRenderFramesPerUpdate = object.maxChasingRenderFramesPerUpdate | 0; - if (object.playerBattleState != null) - message.playerBattleState = object.playerBattleState | 0; - if (object.rollbackEstimatedDtMillis != null) - message.rollbackEstimatedDtMillis = Number(object.rollbackEstimatedDtMillis); - if (object.rollbackEstimatedDtNanos != null) - if ($util.Long) - (message.rollbackEstimatedDtNanos = $util.Long.fromValue(object.rollbackEstimatedDtNanos)).unsigned = false; - else if (typeof object.rollbackEstimatedDtNanos === "string") - message.rollbackEstimatedDtNanos = parseInt(object.rollbackEstimatedDtNanos, 10); - else if (typeof object.rollbackEstimatedDtNanos === "number") - message.rollbackEstimatedDtNanos = object.rollbackEstimatedDtNanos; - else if (typeof object.rollbackEstimatedDtNanos === "object") - message.rollbackEstimatedDtNanos = new $util.LongBits(object.rollbackEstimatedDtNanos.low >>> 0, object.rollbackEstimatedDtNanos.high >>> 0).toNumber(); - if (object.worldToVirtualGridRatio != null) - message.worldToVirtualGridRatio = Number(object.worldToVirtualGridRatio); - if (object.virtualGridToWorldRatio != null) - message.virtualGridToWorldRatio = Number(object.virtualGridToWorldRatio); - if (object.spAtkLookupFrames != null) - message.spAtkLookupFrames = object.spAtkLookupFrames | 0; - if (object.renderCacheSize != null) - message.renderCacheSize = object.renderCacheSize | 0; - return message; - }; - - /** - * Creates a plain object from a BattleColliderInfo message. Also converts values to other types if specified. - * @function toObject - * @memberof protos.BattleColliderInfo - * @static - * @param {protos.BattleColliderInfo} message BattleColliderInfo - * @param {$protobuf.IConversionOptions} [options] Conversion options - * @returns {Object.} Plain object - */ - BattleColliderInfo.toObject = function toObject(message, options) { - if (!options) - options = {}; - var object = {}; - if (options.objects || options.defaults) { - object.strToVec2DListMap = {}; - object.strToPolygon2DListMap = {}; - } - if (options.defaults) { - object.stageName = ""; - object.stageDiscreteW = 0; - object.stageDiscreteH = 0; - object.stageTileW = 0; - object.stageTileH = 0; - object.intervalToPing = 0; - object.willKickIfInactiveFor = 0; - object.boundRoomId = 0; - if ($util.Long) { - var long = new $util.Long(0, 0, false); - object.battleDurationNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.battleDurationNanos = options.longs === String ? "0" : 0; - object.serverFps = 0; - object.inputDelayFrames = 0; - object.inputScaleFrames = 0; - object.nstDelayFrames = 0; - object.inputFrameUpsyncDelayTolerance = 0; - object.maxChasingRenderFramesPerUpdate = 0; - object.playerBattleState = 0; - object.rollbackEstimatedDtMillis = 0; - if ($util.Long) { - var long = new $util.Long(0, 0, false); - object.rollbackEstimatedDtNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; - } else - object.rollbackEstimatedDtNanos = options.longs === String ? "0" : 0; - object.worldToVirtualGridRatio = 0; - object.virtualGridToWorldRatio = 0; - object.spAtkLookupFrames = 0; - object.renderCacheSize = 0; - } - if (message.stageName != null && message.hasOwnProperty("stageName")) - object.stageName = message.stageName; - var keys2; - if (message.strToVec2DListMap && (keys2 = Object.keys(message.strToVec2DListMap)).length) { - object.strToVec2DListMap = {}; - for (var j = 0; j < keys2.length; ++j) - object.strToVec2DListMap[keys2[j]] = $root.sharedprotos.Vec2DList.toObject(message.strToVec2DListMap[keys2[j]], options); - } - if (message.strToPolygon2DListMap && (keys2 = Object.keys(message.strToPolygon2DListMap)).length) { - object.strToPolygon2DListMap = {}; - for (var j = 0; j < keys2.length; ++j) - object.strToPolygon2DListMap[keys2[j]] = $root.sharedprotos.Polygon2DList.toObject(message.strToPolygon2DListMap[keys2[j]], options); - } - if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) - object.stageDiscreteW = message.stageDiscreteW; - if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) - object.stageDiscreteH = message.stageDiscreteH; - if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) - object.stageTileW = message.stageTileW; - if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) - object.stageTileH = message.stageTileH; - if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) - object.intervalToPing = message.intervalToPing; - if (message.willKickIfInactiveFor != null && message.hasOwnProperty("willKickIfInactiveFor")) - object.willKickIfInactiveFor = message.willKickIfInactiveFor; - if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) - object.boundRoomId = message.boundRoomId; - if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) - if (typeof message.battleDurationNanos === "number") - object.battleDurationNanos = options.longs === String ? String(message.battleDurationNanos) : message.battleDurationNanos; - else - object.battleDurationNanos = options.longs === String ? $util.Long.prototype.toString.call(message.battleDurationNanos) : options.longs === Number ? new $util.LongBits(message.battleDurationNanos.low >>> 0, message.battleDurationNanos.high >>> 0).toNumber() : message.battleDurationNanos; - if (message.serverFps != null && message.hasOwnProperty("serverFps")) - object.serverFps = message.serverFps; - if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) - object.inputDelayFrames = message.inputDelayFrames; - if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) - object.inputScaleFrames = message.inputScaleFrames; - if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) - object.nstDelayFrames = message.nstDelayFrames; - if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) - object.inputFrameUpsyncDelayTolerance = message.inputFrameUpsyncDelayTolerance; - if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) - object.maxChasingRenderFramesPerUpdate = message.maxChasingRenderFramesPerUpdate; - if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) - object.playerBattleState = message.playerBattleState; - if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) - object.rollbackEstimatedDtMillis = options.json && !isFinite(message.rollbackEstimatedDtMillis) ? String(message.rollbackEstimatedDtMillis) : message.rollbackEstimatedDtMillis; - if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) - if (typeof message.rollbackEstimatedDtNanos === "number") - object.rollbackEstimatedDtNanos = options.longs === String ? String(message.rollbackEstimatedDtNanos) : message.rollbackEstimatedDtNanos; - else - object.rollbackEstimatedDtNanos = options.longs === String ? $util.Long.prototype.toString.call(message.rollbackEstimatedDtNanos) : options.longs === Number ? new $util.LongBits(message.rollbackEstimatedDtNanos.low >>> 0, message.rollbackEstimatedDtNanos.high >>> 0).toNumber() : message.rollbackEstimatedDtNanos; - if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) - object.worldToVirtualGridRatio = options.json && !isFinite(message.worldToVirtualGridRatio) ? String(message.worldToVirtualGridRatio) : message.worldToVirtualGridRatio; - if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) - object.virtualGridToWorldRatio = options.json && !isFinite(message.virtualGridToWorldRatio) ? String(message.virtualGridToWorldRatio) : message.virtualGridToWorldRatio; - if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) - object.spAtkLookupFrames = message.spAtkLookupFrames; - if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) - object.renderCacheSize = message.renderCacheSize; - return object; - }; - - /** - * Converts this BattleColliderInfo to JSON. - * @function toJSON - * @memberof protos.BattleColliderInfo - * @instance - * @returns {Object.} JSON object - */ - BattleColliderInfo.prototype.toJSON = function toJSON() { - return this.constructor.toObject(this, $protobuf.util.toJSONOptions); - }; - - /** - * Gets the default type url for BattleColliderInfo - * @function getTypeUrl - * @memberof protos.BattleColliderInfo - * @static - * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") - * @returns {string} The default type url - */ - BattleColliderInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) { - if (typeUrlPrefix === undefined) { - typeUrlPrefix = "type.googleapis.com"; - } - return typeUrlPrefix + "/protos.BattleColliderInfo"; - }; - - return BattleColliderInfo; - })(); - protos.PlayerDownsync = (function() { /** @@ -4981,6 +4135,920 @@ $root.protos = (function() { return MeleeBullet; })(); + protos.BattleColliderInfo = (function() { + + /** + * Properties of a BattleColliderInfo. + * @memberof protos + * @interface IBattleColliderInfo + * @property {string|null} [stageName] BattleColliderInfo stageName + * @property {Object.|null} [strToVec2DListMap] BattleColliderInfo strToVec2DListMap + * @property {Object.|null} [strToPolygon2DListMap] BattleColliderInfo strToPolygon2DListMap + * @property {number|null} [stageDiscreteW] BattleColliderInfo stageDiscreteW + * @property {number|null} [stageDiscreteH] BattleColliderInfo stageDiscreteH + * @property {number|null} [stageTileW] BattleColliderInfo stageTileW + * @property {number|null} [stageTileH] BattleColliderInfo stageTileH + * @property {number|null} [intervalToPing] BattleColliderInfo intervalToPing + * @property {number|null} [willKickIfInactiveFor] BattleColliderInfo willKickIfInactiveFor + * @property {number|null} [boundRoomId] BattleColliderInfo boundRoomId + * @property {number|Long|null} [battleDurationNanos] BattleColliderInfo battleDurationNanos + * @property {number|null} [serverFps] BattleColliderInfo serverFps + * @property {number|null} [inputDelayFrames] BattleColliderInfo inputDelayFrames + * @property {number|null} [inputScaleFrames] BattleColliderInfo inputScaleFrames + * @property {number|null} [nstDelayFrames] BattleColliderInfo nstDelayFrames + * @property {number|null} [inputFrameUpsyncDelayTolerance] BattleColliderInfo inputFrameUpsyncDelayTolerance + * @property {number|null} [maxChasingRenderFramesPerUpdate] BattleColliderInfo maxChasingRenderFramesPerUpdate + * @property {number|null} [playerBattleState] BattleColliderInfo playerBattleState + * @property {number|null} [rollbackEstimatedDtMillis] BattleColliderInfo rollbackEstimatedDtMillis + * @property {number|Long|null} [rollbackEstimatedDtNanos] BattleColliderInfo rollbackEstimatedDtNanos + * @property {number|null} [worldToVirtualGridRatio] BattleColliderInfo worldToVirtualGridRatio + * @property {number|null} [virtualGridToWorldRatio] BattleColliderInfo virtualGridToWorldRatio + * @property {number|null} [spAtkLookupFrames] BattleColliderInfo spAtkLookupFrames + * @property {number|null} [renderCacheSize] BattleColliderInfo renderCacheSize + * @property {Object.|null} [meleeSkillConfig] BattleColliderInfo meleeSkillConfig + */ + + /** + * Constructs a new BattleColliderInfo. + * @memberof protos + * @classdesc Represents a BattleColliderInfo. + * @implements IBattleColliderInfo + * @constructor + * @param {protos.IBattleColliderInfo=} [properties] Properties to set + */ + function BattleColliderInfo(properties) { + this.strToVec2DListMap = {}; + this.strToPolygon2DListMap = {}; + this.meleeSkillConfig = {}; + if (properties) + for (var keys = Object.keys(properties), i = 0; i < keys.length; ++i) + if (properties[keys[i]] != null) + this[keys[i]] = properties[keys[i]]; + } + + /** + * BattleColliderInfo stageName. + * @member {string} stageName + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.stageName = ""; + + /** + * BattleColliderInfo strToVec2DListMap. + * @member {Object.} strToVec2DListMap + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.strToVec2DListMap = $util.emptyObject; + + /** + * BattleColliderInfo strToPolygon2DListMap. + * @member {Object.} strToPolygon2DListMap + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.strToPolygon2DListMap = $util.emptyObject; + + /** + * BattleColliderInfo stageDiscreteW. + * @member {number} stageDiscreteW + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.stageDiscreteW = 0; + + /** + * BattleColliderInfo stageDiscreteH. + * @member {number} stageDiscreteH + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.stageDiscreteH = 0; + + /** + * BattleColliderInfo stageTileW. + * @member {number} stageTileW + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.stageTileW = 0; + + /** + * BattleColliderInfo stageTileH. + * @member {number} stageTileH + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.stageTileH = 0; + + /** + * BattleColliderInfo intervalToPing. + * @member {number} intervalToPing + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.intervalToPing = 0; + + /** + * BattleColliderInfo willKickIfInactiveFor. + * @member {number} willKickIfInactiveFor + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.willKickIfInactiveFor = 0; + + /** + * BattleColliderInfo boundRoomId. + * @member {number} boundRoomId + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.boundRoomId = 0; + + /** + * BattleColliderInfo battleDurationNanos. + * @member {number|Long} battleDurationNanos + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.battleDurationNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * BattleColliderInfo serverFps. + * @member {number} serverFps + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.serverFps = 0; + + /** + * BattleColliderInfo inputDelayFrames. + * @member {number} inputDelayFrames + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.inputDelayFrames = 0; + + /** + * BattleColliderInfo inputScaleFrames. + * @member {number} inputScaleFrames + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.inputScaleFrames = 0; + + /** + * BattleColliderInfo nstDelayFrames. + * @member {number} nstDelayFrames + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.nstDelayFrames = 0; + + /** + * BattleColliderInfo inputFrameUpsyncDelayTolerance. + * @member {number} inputFrameUpsyncDelayTolerance + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.inputFrameUpsyncDelayTolerance = 0; + + /** + * BattleColliderInfo maxChasingRenderFramesPerUpdate. + * @member {number} maxChasingRenderFramesPerUpdate + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.maxChasingRenderFramesPerUpdate = 0; + + /** + * BattleColliderInfo playerBattleState. + * @member {number} playerBattleState + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.playerBattleState = 0; + + /** + * BattleColliderInfo rollbackEstimatedDtMillis. + * @member {number} rollbackEstimatedDtMillis + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.rollbackEstimatedDtMillis = 0; + + /** + * BattleColliderInfo rollbackEstimatedDtNanos. + * @member {number|Long} rollbackEstimatedDtNanos + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.rollbackEstimatedDtNanos = $util.Long ? $util.Long.fromBits(0,0,false) : 0; + + /** + * BattleColliderInfo worldToVirtualGridRatio. + * @member {number} worldToVirtualGridRatio + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.worldToVirtualGridRatio = 0; + + /** + * BattleColliderInfo virtualGridToWorldRatio. + * @member {number} virtualGridToWorldRatio + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.virtualGridToWorldRatio = 0; + + /** + * BattleColliderInfo spAtkLookupFrames. + * @member {number} spAtkLookupFrames + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.spAtkLookupFrames = 0; + + /** + * BattleColliderInfo renderCacheSize. + * @member {number} renderCacheSize + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.renderCacheSize = 0; + + /** + * BattleColliderInfo meleeSkillConfig. + * @member {Object.} meleeSkillConfig + * @memberof protos.BattleColliderInfo + * @instance + */ + BattleColliderInfo.prototype.meleeSkillConfig = $util.emptyObject; + + /** + * Creates a new BattleColliderInfo instance using the specified properties. + * @function create + * @memberof protos.BattleColliderInfo + * @static + * @param {protos.IBattleColliderInfo=} [properties] Properties to set + * @returns {protos.BattleColliderInfo} BattleColliderInfo instance + */ + BattleColliderInfo.create = function create(properties) { + return new BattleColliderInfo(properties); + }; + + /** + * Encodes the specified BattleColliderInfo message. Does not implicitly {@link protos.BattleColliderInfo.verify|verify} messages. + * @function encode + * @memberof protos.BattleColliderInfo + * @static + * @param {protos.BattleColliderInfo} message BattleColliderInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BattleColliderInfo.encode = function encode(message, writer) { + if (!writer) + writer = $Writer.create(); + if (message.stageName != null && Object.hasOwnProperty.call(message, "stageName")) + writer.uint32(/* id 1, wireType 2 =*/10).string(message.stageName); + if (message.strToVec2DListMap != null && Object.hasOwnProperty.call(message, "strToVec2DListMap")) + for (var keys = Object.keys(message.strToVec2DListMap), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 2, wireType 2 =*/18).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); + $root.sharedprotos.Vec2DList.encode(message.strToVec2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } + if (message.strToPolygon2DListMap != null && Object.hasOwnProperty.call(message, "strToPolygon2DListMap")) + for (var keys = Object.keys(message.strToPolygon2DListMap), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 3, wireType 2 =*/26).fork().uint32(/* id 1, wireType 2 =*/10).string(keys[i]); + $root.sharedprotos.Polygon2DList.encode(message.strToPolygon2DListMap[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } + if (message.stageDiscreteW != null && Object.hasOwnProperty.call(message, "stageDiscreteW")) + writer.uint32(/* id 4, wireType 0 =*/32).int32(message.stageDiscreteW); + if (message.stageDiscreteH != null && Object.hasOwnProperty.call(message, "stageDiscreteH")) + writer.uint32(/* id 5, wireType 0 =*/40).int32(message.stageDiscreteH); + if (message.stageTileW != null && Object.hasOwnProperty.call(message, "stageTileW")) + writer.uint32(/* id 6, wireType 0 =*/48).int32(message.stageTileW); + if (message.stageTileH != null && Object.hasOwnProperty.call(message, "stageTileH")) + writer.uint32(/* id 7, wireType 0 =*/56).int32(message.stageTileH); + if (message.intervalToPing != null && Object.hasOwnProperty.call(message, "intervalToPing")) + writer.uint32(/* id 8, wireType 0 =*/64).int32(message.intervalToPing); + if (message.willKickIfInactiveFor != null && Object.hasOwnProperty.call(message, "willKickIfInactiveFor")) + writer.uint32(/* id 9, wireType 0 =*/72).int32(message.willKickIfInactiveFor); + if (message.boundRoomId != null && Object.hasOwnProperty.call(message, "boundRoomId")) + writer.uint32(/* id 10, wireType 0 =*/80).int32(message.boundRoomId); + if (message.battleDurationNanos != null && Object.hasOwnProperty.call(message, "battleDurationNanos")) + writer.uint32(/* id 11, wireType 0 =*/88).int64(message.battleDurationNanos); + if (message.serverFps != null && Object.hasOwnProperty.call(message, "serverFps")) + writer.uint32(/* id 12, wireType 0 =*/96).int32(message.serverFps); + if (message.inputDelayFrames != null && Object.hasOwnProperty.call(message, "inputDelayFrames")) + writer.uint32(/* id 13, wireType 0 =*/104).int32(message.inputDelayFrames); + if (message.inputScaleFrames != null && Object.hasOwnProperty.call(message, "inputScaleFrames")) + writer.uint32(/* id 14, wireType 0 =*/112).uint32(message.inputScaleFrames); + if (message.nstDelayFrames != null && Object.hasOwnProperty.call(message, "nstDelayFrames")) + writer.uint32(/* id 15, wireType 0 =*/120).int32(message.nstDelayFrames); + if (message.inputFrameUpsyncDelayTolerance != null && Object.hasOwnProperty.call(message, "inputFrameUpsyncDelayTolerance")) + writer.uint32(/* id 16, wireType 0 =*/128).int32(message.inputFrameUpsyncDelayTolerance); + if (message.maxChasingRenderFramesPerUpdate != null && Object.hasOwnProperty.call(message, "maxChasingRenderFramesPerUpdate")) + writer.uint32(/* id 17, wireType 0 =*/136).int32(message.maxChasingRenderFramesPerUpdate); + if (message.playerBattleState != null && Object.hasOwnProperty.call(message, "playerBattleState")) + writer.uint32(/* id 18, wireType 0 =*/144).int32(message.playerBattleState); + if (message.rollbackEstimatedDtMillis != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtMillis")) + writer.uint32(/* id 19, wireType 1 =*/153).double(message.rollbackEstimatedDtMillis); + if (message.rollbackEstimatedDtNanos != null && Object.hasOwnProperty.call(message, "rollbackEstimatedDtNanos")) + writer.uint32(/* id 20, wireType 0 =*/160).int64(message.rollbackEstimatedDtNanos); + if (message.worldToVirtualGridRatio != null && Object.hasOwnProperty.call(message, "worldToVirtualGridRatio")) + writer.uint32(/* id 21, wireType 1 =*/169).double(message.worldToVirtualGridRatio); + if (message.virtualGridToWorldRatio != null && Object.hasOwnProperty.call(message, "virtualGridToWorldRatio")) + writer.uint32(/* id 22, wireType 1 =*/177).double(message.virtualGridToWorldRatio); + if (message.spAtkLookupFrames != null && Object.hasOwnProperty.call(message, "spAtkLookupFrames")) + writer.uint32(/* id 23, wireType 0 =*/184).int32(message.spAtkLookupFrames); + if (message.renderCacheSize != null && Object.hasOwnProperty.call(message, "renderCacheSize")) + writer.uint32(/* id 24, wireType 0 =*/192).int32(message.renderCacheSize); + if (message.meleeSkillConfig != null && Object.hasOwnProperty.call(message, "meleeSkillConfig")) + for (var keys = Object.keys(message.meleeSkillConfig), i = 0; i < keys.length; ++i) { + writer.uint32(/* id 25, wireType 2 =*/202).fork().uint32(/* id 1, wireType 0 =*/8).int32(keys[i]); + $root.protos.MeleeBullet.encode(message.meleeSkillConfig[keys[i]], writer.uint32(/* id 2, wireType 2 =*/18).fork()).ldelim().ldelim(); + } + return writer; + }; + + /** + * Encodes the specified BattleColliderInfo message, length delimited. Does not implicitly {@link protos.BattleColliderInfo.verify|verify} messages. + * @function encodeDelimited + * @memberof protos.BattleColliderInfo + * @static + * @param {protos.BattleColliderInfo} message BattleColliderInfo message or plain object to encode + * @param {$protobuf.Writer} [writer] Writer to encode to + * @returns {$protobuf.Writer} Writer + */ + BattleColliderInfo.encodeDelimited = function encodeDelimited(message, writer) { + return this.encode(message, writer).ldelim(); + }; + + /** + * Decodes a BattleColliderInfo message from the specified reader or buffer. + * @function decode + * @memberof protos.BattleColliderInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @param {number} [length] Message length if known beforehand + * @returns {protos.BattleColliderInfo} BattleColliderInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BattleColliderInfo.decode = function decode(reader, length) { + if (!(reader instanceof $Reader)) + reader = $Reader.create(reader); + var end = length === undefined ? reader.len : reader.pos + length, message = new $root.protos.BattleColliderInfo(), key, value; + while (reader.pos < end) { + var tag = reader.uint32(); + switch (tag >>> 3) { + case 1: { + message.stageName = reader.string(); + break; + } + case 2: { + if (message.strToVec2DListMap === $util.emptyObject) + message.strToVec2DListMap = {}; + var end2 = reader.uint32() + reader.pos; + key = ""; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = $root.sharedprotos.Vec2DList.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.strToVec2DListMap[key] = value; + break; + } + case 3: { + if (message.strToPolygon2DListMap === $util.emptyObject) + message.strToPolygon2DListMap = {}; + var end2 = reader.uint32() + reader.pos; + key = ""; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.string(); + break; + case 2: + value = $root.sharedprotos.Polygon2DList.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.strToPolygon2DListMap[key] = value; + break; + } + case 4: { + message.stageDiscreteW = reader.int32(); + break; + } + case 5: { + message.stageDiscreteH = reader.int32(); + break; + } + case 6: { + message.stageTileW = reader.int32(); + break; + } + case 7: { + message.stageTileH = reader.int32(); + break; + } + case 8: { + message.intervalToPing = reader.int32(); + break; + } + case 9: { + message.willKickIfInactiveFor = reader.int32(); + break; + } + case 10: { + message.boundRoomId = reader.int32(); + break; + } + case 11: { + message.battleDurationNanos = reader.int64(); + break; + } + case 12: { + message.serverFps = reader.int32(); + break; + } + case 13: { + message.inputDelayFrames = reader.int32(); + break; + } + case 14: { + message.inputScaleFrames = reader.uint32(); + break; + } + case 15: { + message.nstDelayFrames = reader.int32(); + break; + } + case 16: { + message.inputFrameUpsyncDelayTolerance = reader.int32(); + break; + } + case 17: { + message.maxChasingRenderFramesPerUpdate = reader.int32(); + break; + } + case 18: { + message.playerBattleState = reader.int32(); + break; + } + case 19: { + message.rollbackEstimatedDtMillis = reader.double(); + break; + } + case 20: { + message.rollbackEstimatedDtNanos = reader.int64(); + break; + } + case 21: { + message.worldToVirtualGridRatio = reader.double(); + break; + } + case 22: { + message.virtualGridToWorldRatio = reader.double(); + break; + } + case 23: { + message.spAtkLookupFrames = reader.int32(); + break; + } + case 24: { + message.renderCacheSize = reader.int32(); + break; + } + case 25: { + if (message.meleeSkillConfig === $util.emptyObject) + message.meleeSkillConfig = {}; + var end2 = reader.uint32() + reader.pos; + key = 0; + value = null; + while (reader.pos < end2) { + var tag2 = reader.uint32(); + switch (tag2 >>> 3) { + case 1: + key = reader.int32(); + break; + case 2: + value = $root.protos.MeleeBullet.decode(reader, reader.uint32()); + break; + default: + reader.skipType(tag2 & 7); + break; + } + } + message.meleeSkillConfig[key] = value; + break; + } + default: + reader.skipType(tag & 7); + break; + } + } + return message; + }; + + /** + * Decodes a BattleColliderInfo message from the specified reader or buffer, length delimited. + * @function decodeDelimited + * @memberof protos.BattleColliderInfo + * @static + * @param {$protobuf.Reader|Uint8Array} reader Reader or buffer to decode from + * @returns {protos.BattleColliderInfo} BattleColliderInfo + * @throws {Error} If the payload is not a reader or valid buffer + * @throws {$protobuf.util.ProtocolError} If required fields are missing + */ + BattleColliderInfo.decodeDelimited = function decodeDelimited(reader) { + if (!(reader instanceof $Reader)) + reader = new $Reader(reader); + return this.decode(reader, reader.uint32()); + }; + + /** + * Verifies a BattleColliderInfo message. + * @function verify + * @memberof protos.BattleColliderInfo + * @static + * @param {Object.} message Plain object to verify + * @returns {string|null} `null` if valid, otherwise the reason why it is not + */ + BattleColliderInfo.verify = function verify(message) { + if (typeof message !== "object" || message === null) + return "object expected"; + if (message.stageName != null && message.hasOwnProperty("stageName")) + if (!$util.isString(message.stageName)) + return "stageName: string expected"; + if (message.strToVec2DListMap != null && message.hasOwnProperty("strToVec2DListMap")) { + if (!$util.isObject(message.strToVec2DListMap)) + return "strToVec2DListMap: object expected"; + var key = Object.keys(message.strToVec2DListMap); + for (var i = 0; i < key.length; ++i) { + var error = $root.sharedprotos.Vec2DList.verify(message.strToVec2DListMap[key[i]]); + if (error) + return "strToVec2DListMap." + error; + } + } + if (message.strToPolygon2DListMap != null && message.hasOwnProperty("strToPolygon2DListMap")) { + if (!$util.isObject(message.strToPolygon2DListMap)) + return "strToPolygon2DListMap: object expected"; + var key = Object.keys(message.strToPolygon2DListMap); + for (var i = 0; i < key.length; ++i) { + var error = $root.sharedprotos.Polygon2DList.verify(message.strToPolygon2DListMap[key[i]]); + if (error) + return "strToPolygon2DListMap." + error; + } + } + if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) + if (!$util.isInteger(message.stageDiscreteW)) + return "stageDiscreteW: integer expected"; + if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) + if (!$util.isInteger(message.stageDiscreteH)) + return "stageDiscreteH: integer expected"; + if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) + if (!$util.isInteger(message.stageTileW)) + return "stageTileW: integer expected"; + if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) + if (!$util.isInteger(message.stageTileH)) + return "stageTileH: integer expected"; + if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) + if (!$util.isInteger(message.intervalToPing)) + return "intervalToPing: integer expected"; + if (message.willKickIfInactiveFor != null && message.hasOwnProperty("willKickIfInactiveFor")) + if (!$util.isInteger(message.willKickIfInactiveFor)) + return "willKickIfInactiveFor: integer expected"; + if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) + if (!$util.isInteger(message.boundRoomId)) + return "boundRoomId: integer expected"; + if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) + if (!$util.isInteger(message.battleDurationNanos) && !(message.battleDurationNanos && $util.isInteger(message.battleDurationNanos.low) && $util.isInteger(message.battleDurationNanos.high))) + return "battleDurationNanos: integer|Long expected"; + if (message.serverFps != null && message.hasOwnProperty("serverFps")) + if (!$util.isInteger(message.serverFps)) + return "serverFps: integer expected"; + if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) + if (!$util.isInteger(message.inputDelayFrames)) + return "inputDelayFrames: integer expected"; + if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) + if (!$util.isInteger(message.inputScaleFrames)) + return "inputScaleFrames: integer expected"; + if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) + if (!$util.isInteger(message.nstDelayFrames)) + return "nstDelayFrames: integer expected"; + if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) + if (!$util.isInteger(message.inputFrameUpsyncDelayTolerance)) + return "inputFrameUpsyncDelayTolerance: integer expected"; + if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) + if (!$util.isInteger(message.maxChasingRenderFramesPerUpdate)) + return "maxChasingRenderFramesPerUpdate: integer expected"; + if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) + if (!$util.isInteger(message.playerBattleState)) + return "playerBattleState: integer expected"; + if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) + if (typeof message.rollbackEstimatedDtMillis !== "number") + return "rollbackEstimatedDtMillis: number expected"; + if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) + if (!$util.isInteger(message.rollbackEstimatedDtNanos) && !(message.rollbackEstimatedDtNanos && $util.isInteger(message.rollbackEstimatedDtNanos.low) && $util.isInteger(message.rollbackEstimatedDtNanos.high))) + return "rollbackEstimatedDtNanos: integer|Long expected"; + if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) + if (typeof message.worldToVirtualGridRatio !== "number") + return "worldToVirtualGridRatio: number expected"; + if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) + if (typeof message.virtualGridToWorldRatio !== "number") + return "virtualGridToWorldRatio: number expected"; + if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) + if (!$util.isInteger(message.spAtkLookupFrames)) + return "spAtkLookupFrames: integer expected"; + if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) + if (!$util.isInteger(message.renderCacheSize)) + return "renderCacheSize: integer expected"; + if (message.meleeSkillConfig != null && message.hasOwnProperty("meleeSkillConfig")) { + if (!$util.isObject(message.meleeSkillConfig)) + return "meleeSkillConfig: object expected"; + var key = Object.keys(message.meleeSkillConfig); + for (var i = 0; i < key.length; ++i) { + if (!$util.key32Re.test(key[i])) + return "meleeSkillConfig: integer key{k:int32} expected"; + { + var error = $root.protos.MeleeBullet.verify(message.meleeSkillConfig[key[i]]); + if (error) + return "meleeSkillConfig." + error; + } + } + } + return null; + }; + + /** + * Creates a BattleColliderInfo message from a plain object. Also converts values to their respective internal types. + * @function fromObject + * @memberof protos.BattleColliderInfo + * @static + * @param {Object.} object Plain object + * @returns {protos.BattleColliderInfo} BattleColliderInfo + */ + BattleColliderInfo.fromObject = function fromObject(object) { + if (object instanceof $root.protos.BattleColliderInfo) + return object; + var message = new $root.protos.BattleColliderInfo(); + if (object.stageName != null) + message.stageName = String(object.stageName); + if (object.strToVec2DListMap) { + if (typeof object.strToVec2DListMap !== "object") + throw TypeError(".protos.BattleColliderInfo.strToVec2DListMap: object expected"); + message.strToVec2DListMap = {}; + for (var keys = Object.keys(object.strToVec2DListMap), i = 0; i < keys.length; ++i) { + if (typeof object.strToVec2DListMap[keys[i]] !== "object") + throw TypeError(".protos.BattleColliderInfo.strToVec2DListMap: object expected"); + message.strToVec2DListMap[keys[i]] = $root.sharedprotos.Vec2DList.fromObject(object.strToVec2DListMap[keys[i]]); + } + } + if (object.strToPolygon2DListMap) { + if (typeof object.strToPolygon2DListMap !== "object") + throw TypeError(".protos.BattleColliderInfo.strToPolygon2DListMap: object expected"); + message.strToPolygon2DListMap = {}; + for (var keys = Object.keys(object.strToPolygon2DListMap), i = 0; i < keys.length; ++i) { + if (typeof object.strToPolygon2DListMap[keys[i]] !== "object") + throw TypeError(".protos.BattleColliderInfo.strToPolygon2DListMap: object expected"); + message.strToPolygon2DListMap[keys[i]] = $root.sharedprotos.Polygon2DList.fromObject(object.strToPolygon2DListMap[keys[i]]); + } + } + if (object.stageDiscreteW != null) + message.stageDiscreteW = object.stageDiscreteW | 0; + if (object.stageDiscreteH != null) + message.stageDiscreteH = object.stageDiscreteH | 0; + if (object.stageTileW != null) + message.stageTileW = object.stageTileW | 0; + if (object.stageTileH != null) + message.stageTileH = object.stageTileH | 0; + if (object.intervalToPing != null) + message.intervalToPing = object.intervalToPing | 0; + if (object.willKickIfInactiveFor != null) + message.willKickIfInactiveFor = object.willKickIfInactiveFor | 0; + if (object.boundRoomId != null) + message.boundRoomId = object.boundRoomId | 0; + if (object.battleDurationNanos != null) + if ($util.Long) + (message.battleDurationNanos = $util.Long.fromValue(object.battleDurationNanos)).unsigned = false; + else if (typeof object.battleDurationNanos === "string") + message.battleDurationNanos = parseInt(object.battleDurationNanos, 10); + else if (typeof object.battleDurationNanos === "number") + message.battleDurationNanos = object.battleDurationNanos; + else if (typeof object.battleDurationNanos === "object") + message.battleDurationNanos = new $util.LongBits(object.battleDurationNanos.low >>> 0, object.battleDurationNanos.high >>> 0).toNumber(); + if (object.serverFps != null) + message.serverFps = object.serverFps | 0; + if (object.inputDelayFrames != null) + message.inputDelayFrames = object.inputDelayFrames | 0; + if (object.inputScaleFrames != null) + message.inputScaleFrames = object.inputScaleFrames >>> 0; + if (object.nstDelayFrames != null) + message.nstDelayFrames = object.nstDelayFrames | 0; + if (object.inputFrameUpsyncDelayTolerance != null) + message.inputFrameUpsyncDelayTolerance = object.inputFrameUpsyncDelayTolerance | 0; + if (object.maxChasingRenderFramesPerUpdate != null) + message.maxChasingRenderFramesPerUpdate = object.maxChasingRenderFramesPerUpdate | 0; + if (object.playerBattleState != null) + message.playerBattleState = object.playerBattleState | 0; + if (object.rollbackEstimatedDtMillis != null) + message.rollbackEstimatedDtMillis = Number(object.rollbackEstimatedDtMillis); + if (object.rollbackEstimatedDtNanos != null) + if ($util.Long) + (message.rollbackEstimatedDtNanos = $util.Long.fromValue(object.rollbackEstimatedDtNanos)).unsigned = false; + else if (typeof object.rollbackEstimatedDtNanos === "string") + message.rollbackEstimatedDtNanos = parseInt(object.rollbackEstimatedDtNanos, 10); + else if (typeof object.rollbackEstimatedDtNanos === "number") + message.rollbackEstimatedDtNanos = object.rollbackEstimatedDtNanos; + else if (typeof object.rollbackEstimatedDtNanos === "object") + message.rollbackEstimatedDtNanos = new $util.LongBits(object.rollbackEstimatedDtNanos.low >>> 0, object.rollbackEstimatedDtNanos.high >>> 0).toNumber(); + if (object.worldToVirtualGridRatio != null) + message.worldToVirtualGridRatio = Number(object.worldToVirtualGridRatio); + if (object.virtualGridToWorldRatio != null) + message.virtualGridToWorldRatio = Number(object.virtualGridToWorldRatio); + if (object.spAtkLookupFrames != null) + message.spAtkLookupFrames = object.spAtkLookupFrames | 0; + if (object.renderCacheSize != null) + message.renderCacheSize = object.renderCacheSize | 0; + if (object.meleeSkillConfig) { + if (typeof object.meleeSkillConfig !== "object") + throw TypeError(".protos.BattleColliderInfo.meleeSkillConfig: object expected"); + message.meleeSkillConfig = {}; + for (var keys = Object.keys(object.meleeSkillConfig), i = 0; i < keys.length; ++i) { + if (typeof object.meleeSkillConfig[keys[i]] !== "object") + throw TypeError(".protos.BattleColliderInfo.meleeSkillConfig: object expected"); + message.meleeSkillConfig[keys[i]] = $root.protos.MeleeBullet.fromObject(object.meleeSkillConfig[keys[i]]); + } + } + return message; + }; + + /** + * Creates a plain object from a BattleColliderInfo message. Also converts values to other types if specified. + * @function toObject + * @memberof protos.BattleColliderInfo + * @static + * @param {protos.BattleColliderInfo} message BattleColliderInfo + * @param {$protobuf.IConversionOptions} [options] Conversion options + * @returns {Object.} Plain object + */ + BattleColliderInfo.toObject = function toObject(message, options) { + if (!options) + options = {}; + var object = {}; + if (options.objects || options.defaults) { + object.strToVec2DListMap = {}; + object.strToPolygon2DListMap = {}; + object.meleeSkillConfig = {}; + } + if (options.defaults) { + object.stageName = ""; + object.stageDiscreteW = 0; + object.stageDiscreteH = 0; + object.stageTileW = 0; + object.stageTileH = 0; + object.intervalToPing = 0; + object.willKickIfInactiveFor = 0; + object.boundRoomId = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.battleDurationNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.battleDurationNanos = options.longs === String ? "0" : 0; + object.serverFps = 0; + object.inputDelayFrames = 0; + object.inputScaleFrames = 0; + object.nstDelayFrames = 0; + object.inputFrameUpsyncDelayTolerance = 0; + object.maxChasingRenderFramesPerUpdate = 0; + object.playerBattleState = 0; + object.rollbackEstimatedDtMillis = 0; + if ($util.Long) { + var long = new $util.Long(0, 0, false); + object.rollbackEstimatedDtNanos = options.longs === String ? long.toString() : options.longs === Number ? long.toNumber() : long; + } else + object.rollbackEstimatedDtNanos = options.longs === String ? "0" : 0; + object.worldToVirtualGridRatio = 0; + object.virtualGridToWorldRatio = 0; + object.spAtkLookupFrames = 0; + object.renderCacheSize = 0; + } + if (message.stageName != null && message.hasOwnProperty("stageName")) + object.stageName = message.stageName; + var keys2; + if (message.strToVec2DListMap && (keys2 = Object.keys(message.strToVec2DListMap)).length) { + object.strToVec2DListMap = {}; + for (var j = 0; j < keys2.length; ++j) + object.strToVec2DListMap[keys2[j]] = $root.sharedprotos.Vec2DList.toObject(message.strToVec2DListMap[keys2[j]], options); + } + if (message.strToPolygon2DListMap && (keys2 = Object.keys(message.strToPolygon2DListMap)).length) { + object.strToPolygon2DListMap = {}; + for (var j = 0; j < keys2.length; ++j) + object.strToPolygon2DListMap[keys2[j]] = $root.sharedprotos.Polygon2DList.toObject(message.strToPolygon2DListMap[keys2[j]], options); + } + if (message.stageDiscreteW != null && message.hasOwnProperty("stageDiscreteW")) + object.stageDiscreteW = message.stageDiscreteW; + if (message.stageDiscreteH != null && message.hasOwnProperty("stageDiscreteH")) + object.stageDiscreteH = message.stageDiscreteH; + if (message.stageTileW != null && message.hasOwnProperty("stageTileW")) + object.stageTileW = message.stageTileW; + if (message.stageTileH != null && message.hasOwnProperty("stageTileH")) + object.stageTileH = message.stageTileH; + if (message.intervalToPing != null && message.hasOwnProperty("intervalToPing")) + object.intervalToPing = message.intervalToPing; + if (message.willKickIfInactiveFor != null && message.hasOwnProperty("willKickIfInactiveFor")) + object.willKickIfInactiveFor = message.willKickIfInactiveFor; + if (message.boundRoomId != null && message.hasOwnProperty("boundRoomId")) + object.boundRoomId = message.boundRoomId; + if (message.battleDurationNanos != null && message.hasOwnProperty("battleDurationNanos")) + if (typeof message.battleDurationNanos === "number") + object.battleDurationNanos = options.longs === String ? String(message.battleDurationNanos) : message.battleDurationNanos; + else + object.battleDurationNanos = options.longs === String ? $util.Long.prototype.toString.call(message.battleDurationNanos) : options.longs === Number ? new $util.LongBits(message.battleDurationNanos.low >>> 0, message.battleDurationNanos.high >>> 0).toNumber() : message.battleDurationNanos; + if (message.serverFps != null && message.hasOwnProperty("serverFps")) + object.serverFps = message.serverFps; + if (message.inputDelayFrames != null && message.hasOwnProperty("inputDelayFrames")) + object.inputDelayFrames = message.inputDelayFrames; + if (message.inputScaleFrames != null && message.hasOwnProperty("inputScaleFrames")) + object.inputScaleFrames = message.inputScaleFrames; + if (message.nstDelayFrames != null && message.hasOwnProperty("nstDelayFrames")) + object.nstDelayFrames = message.nstDelayFrames; + if (message.inputFrameUpsyncDelayTolerance != null && message.hasOwnProperty("inputFrameUpsyncDelayTolerance")) + object.inputFrameUpsyncDelayTolerance = message.inputFrameUpsyncDelayTolerance; + if (message.maxChasingRenderFramesPerUpdate != null && message.hasOwnProperty("maxChasingRenderFramesPerUpdate")) + object.maxChasingRenderFramesPerUpdate = message.maxChasingRenderFramesPerUpdate; + if (message.playerBattleState != null && message.hasOwnProperty("playerBattleState")) + object.playerBattleState = message.playerBattleState; + if (message.rollbackEstimatedDtMillis != null && message.hasOwnProperty("rollbackEstimatedDtMillis")) + object.rollbackEstimatedDtMillis = options.json && !isFinite(message.rollbackEstimatedDtMillis) ? String(message.rollbackEstimatedDtMillis) : message.rollbackEstimatedDtMillis; + if (message.rollbackEstimatedDtNanos != null && message.hasOwnProperty("rollbackEstimatedDtNanos")) + if (typeof message.rollbackEstimatedDtNanos === "number") + object.rollbackEstimatedDtNanos = options.longs === String ? String(message.rollbackEstimatedDtNanos) : message.rollbackEstimatedDtNanos; + else + object.rollbackEstimatedDtNanos = options.longs === String ? $util.Long.prototype.toString.call(message.rollbackEstimatedDtNanos) : options.longs === Number ? new $util.LongBits(message.rollbackEstimatedDtNanos.low >>> 0, message.rollbackEstimatedDtNanos.high >>> 0).toNumber() : message.rollbackEstimatedDtNanos; + if (message.worldToVirtualGridRatio != null && message.hasOwnProperty("worldToVirtualGridRatio")) + object.worldToVirtualGridRatio = options.json && !isFinite(message.worldToVirtualGridRatio) ? String(message.worldToVirtualGridRatio) : message.worldToVirtualGridRatio; + if (message.virtualGridToWorldRatio != null && message.hasOwnProperty("virtualGridToWorldRatio")) + object.virtualGridToWorldRatio = options.json && !isFinite(message.virtualGridToWorldRatio) ? String(message.virtualGridToWorldRatio) : message.virtualGridToWorldRatio; + if (message.spAtkLookupFrames != null && message.hasOwnProperty("spAtkLookupFrames")) + object.spAtkLookupFrames = message.spAtkLookupFrames; + if (message.renderCacheSize != null && message.hasOwnProperty("renderCacheSize")) + object.renderCacheSize = message.renderCacheSize; + if (message.meleeSkillConfig && (keys2 = Object.keys(message.meleeSkillConfig)).length) { + object.meleeSkillConfig = {}; + for (var j = 0; j < keys2.length; ++j) + object.meleeSkillConfig[keys2[j]] = $root.protos.MeleeBullet.toObject(message.meleeSkillConfig[keys2[j]], options); + } + return object; + }; + + /** + * Converts this BattleColliderInfo to JSON. + * @function toJSON + * @memberof protos.BattleColliderInfo + * @instance + * @returns {Object.} JSON object + */ + BattleColliderInfo.prototype.toJSON = function toJSON() { + return this.constructor.toObject(this, $protobuf.util.toJSONOptions); + }; + + /** + * Gets the default type url for BattleColliderInfo + * @function getTypeUrl + * @memberof protos.BattleColliderInfo + * @static + * @param {string} [typeUrlPrefix] your custom typeUrlPrefix(default "type.googleapis.com") + * @returns {string} The default type url + */ + BattleColliderInfo.getTypeUrl = function getTypeUrl(typeUrlPrefix) { + if (typeUrlPrefix === undefined) { + typeUrlPrefix = "type.googleapis.com"; + } + return typeUrlPrefix + "/protos.BattleColliderInfo"; + }; + + return BattleColliderInfo; + })(); + protos.RoomDownsyncFrame = (function() { /**