diff --git a/messages/messages.proto b/messages/messages.proto index 5909d21..a9d4f37 100644 --- a/messages/messages.proto +++ b/messages/messages.proto @@ -15,6 +15,7 @@ message Leave {} message ReplayLink { string replay = 1; } message ReplayMove {} message ReplaySelectGame { int32 game = 1; } +message StartEarly {} message GameInfo { int32 gamesPlayed = 1; @@ -251,5 +252,6 @@ message Message { ReplayMove replay_move = 38; ReplaySelectGame replay_select_game = 39; GameInfo game_info = 40; + StartEarly start_early = 41; } } diff --git a/tarok/lib/controller.dart b/tarok/lib/controller.dart index 9e85b9c..e7e62cc 100644 --- a/tarok/lib/controller.dart +++ b/tarok/lib/controller.dart @@ -396,6 +396,17 @@ class Controller extends GetxController { debugPrint("Sent the GameEnd packet"); } + Future gameStartEarly() async { + debugPrint("Called gameStartEarly"); + if (bots) return; + debugPrint("Sending the StartEarly packet"); + requestedGameEnd.value = true; + final Uint8List message = + Messages.Message(startEarly: Messages.StartEarly()).writeToBuffer(); + socket.send(message); + debugPrint("Sent the StartEarly packet"); + } + Future sendMessageString(String m) async { if (bots) return; final Uint8List message = Messages.Message( diff --git a/tarok/lib/game.dart b/tarok/lib/game.dart index c21dcec..fe7abd7 100644 --- a/tarok/lib/game.dart +++ b/tarok/lib/game.dart @@ -1634,6 +1634,20 @@ class Game extends StatelessWidget { child: Column( mainAxisSize: MainAxisSize.min, children: [ + if (controller.gamesPlayed.value != + controller.gamesRequired.value && + !controller.bots && + controller.gamesRequired.value != -1) + ElevatedButton( + onPressed: () async => + await controller.gameStartEarly(), + child: const Text("Takoj naprej")), + if (controller.gamesPlayed.value != + controller.gamesRequired.value && + !controller.bots) + const SizedBox( + height: 10, + ), ...controller.results.value!.user.map( (e) => Column( children: [ diff --git a/tarok/lib/messages.pb.dart b/tarok/lib/messages.pb.dart index db160bb..db83c4d 100644 --- a/tarok/lib/messages.pb.dart +++ b/tarok/lib/messages.pb.dart @@ -411,6 +411,35 @@ class ReplaySelectGame extends $pb.GeneratedMessage { void clearGame() => clearField(1); } +class StartEarly extends $pb.GeneratedMessage { + static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'StartEarly', createEmptyInstance: create) + ..hasRequiredFields = false + ; + + StartEarly._() : super(); + factory StartEarly() => create(); + factory StartEarly.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); + factory StartEarly.fromJson($core.String i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(i, r); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.deepCopy] instead. ' + 'Will be removed in next major version') + StartEarly clone() => StartEarly()..mergeFromMessage(this); + @$core.Deprecated( + 'Using this can add significant overhead to your binary. ' + 'Use [GeneratedMessageGenericExtensions.rebuild] instead. ' + 'Will be removed in next major version') + StartEarly copyWith(void Function(StartEarly) updates) => super.copyWith((message) => updates(message as StartEarly)) as StartEarly; // ignore: deprecated_member_use + $pb.BuilderInfo get info_ => _i; + @$core.pragma('dart2js:noInline') + static StartEarly create() => StartEarly._(); + StartEarly createEmptyInstance() => create(); + static $pb.PbList createRepeated() => $pb.PbList(); + @$core.pragma('dart2js:noInline') + static StartEarly getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); + static StartEarly? _defaultInstance; +} + class GameInfo extends $pb.GeneratedMessage { static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'GameInfo', createEmptyInstance: create) ..a<$core.int>(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gamesPlayed', $pb.PbFieldType.O3, protoName: 'gamesPlayed') @@ -3049,6 +3078,7 @@ enum Message_Data { replayMove, replaySelectGame, gameInfo, + startEarly, notSet } @@ -3085,10 +3115,11 @@ class Message extends $pb.GeneratedMessage { 38 : Message_Data.replayMove, 39 : Message_Data.replaySelectGame, 40 : Message_Data.gameInfo, + 41 : Message_Data.startEarly, 0 : Message_Data.notSet }; static final $pb.BuilderInfo _i = $pb.BuilderInfo(const $core.bool.fromEnvironment('protobuf.omit_message_names') ? '' : 'Message', createEmptyInstance: create) - ..oo(0, [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40]) + ..oo(0, [10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41]) ..aOS(1, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'username') ..aOS(2, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'playerId') ..aOB(4, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'silent') @@ -3123,6 +3154,7 @@ class Message extends $pb.GeneratedMessage { ..aOM(38, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replayMove', subBuilder: ReplayMove.create) ..aOM(39, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'replaySelectGame', subBuilder: ReplaySelectGame.create) ..aOM(40, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'gameInfo', subBuilder: GameInfo.create) + ..aOM(41, const $core.bool.fromEnvironment('protobuf.omit_field_names') ? '' : 'startEarly', subBuilder: StartEarly.create) ..hasRequiredFields = false ; @@ -3162,6 +3194,7 @@ class Message extends $pb.GeneratedMessage { ReplayMove? replayMove, ReplaySelectGame? replaySelectGame, GameInfo? gameInfo, + StartEarly? startEarly, }) { final _result = create(); if (username != null) { @@ -3266,6 +3299,9 @@ class Message extends $pb.GeneratedMessage { if (gameInfo != null) { _result.gameInfo = gameInfo; } + if (startEarly != null) { + _result.startEarly = startEarly; + } return _result; } factory Message.fromBuffer($core.List<$core.int> i, [$pb.ExtensionRegistry r = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(i, r); @@ -3659,5 +3695,16 @@ class Message extends $pb.GeneratedMessage { void clearGameInfo() => clearField(40); @$pb.TagNumber(40) GameInfo ensureGameInfo() => $_ensure(33); + + @$pb.TagNumber(41) + StartEarly get startEarly => $_getN(34); + @$pb.TagNumber(41) + set startEarly(StartEarly v) { setField(41, v); } + @$pb.TagNumber(41) + $core.bool hasStartEarly() => $_has(34); + @$pb.TagNumber(41) + void clearStartEarly() => clearField(41); + @$pb.TagNumber(41) + StartEarly ensureStartEarly() => $_ensure(34); } diff --git a/tarok/lib/messages.pbjson.dart b/tarok/lib/messages.pbjson.dart index bfc09e7..c68aa83 100644 --- a/tarok/lib/messages.pbjson.dart +++ b/tarok/lib/messages.pbjson.dart @@ -101,6 +101,13 @@ const ReplaySelectGame$json = const { /// Descriptor for `ReplaySelectGame`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List replaySelectGameDescriptor = $convert.base64Decode('ChBSZXBsYXlTZWxlY3RHYW1lEhIKBGdhbWUYASABKAVSBGdhbWU='); +@$core.Deprecated('Use startEarlyDescriptor instead') +const StartEarly$json = const { + '1': 'StartEarly', +}; + +/// Descriptor for `StartEarly`. Decode as a `google.protobuf.DescriptorProto`. +final $typed_data.Uint8List startEarlyDescriptor = $convert.base64Decode('CgpTdGFydEVhcmx5'); @$core.Deprecated('Use gameInfoDescriptor instead') const GameInfo$json = const { '1': 'GameInfo', @@ -529,6 +536,7 @@ const Message$json = const { const {'1': 'replay_move', '3': 38, '4': 1, '5': 11, '6': '.ReplayMove', '9': 0, '10': 'replayMove'}, const {'1': 'replay_select_game', '3': 39, '4': 1, '5': 11, '6': '.ReplaySelectGame', '9': 0, '10': 'replaySelectGame'}, const {'1': 'game_info', '3': 40, '4': 1, '5': 11, '6': '.GameInfo', '9': 0, '10': 'gameInfo'}, + const {'1': 'start_early', '3': 41, '4': 1, '5': 11, '6': '.StartEarly', '9': 0, '10': 'startEarly'}, ], '8': const [ const {'1': 'data'}, @@ -536,4 +544,4 @@ const Message$json = const { }; /// Descriptor for `Message`. Decode as a `google.protobuf.DescriptorProto`. -final $typed_data.Uint8List messageDescriptor = $convert.base64Decode('CgdNZXNzYWdlEhoKCHVzZXJuYW1lGAEgASgJUgh1c2VybmFtZRIbCglwbGF5ZXJfaWQYAiABKAlSCHBsYXllcklkEhYKBnNpbGVudBgEIAEoCFIGc2lsZW50Ei0KCmNvbm5lY3Rpb24YCiABKAsyCy5Db25uZWN0aW9uSABSCmNvbm5lY3Rpb24SMAoLbGljaXRpcmFuamUYCyABKAsyDC5MaWNpdGlyYW5qZUgAUgtsaWNpdGlyYW5qZRIbCgRjYXJkGAwgASgLMgUuQ2FyZEgAUgRjYXJkEkAKEWxpY2l0aXJhbmplX3N0YXJ0GA0gASgLMhEuTGljaXRpcmFuamVTdGFydEgAUhBsaWNpdGlyYW5qZVN0YXJ0EisKCmdhbWVfc3RhcnQYDiABKAsyCi5HYW1lU3RhcnRIAFIJZ2FtZVN0YXJ0EjQKDWxvZ2luX3JlcXVlc3QYDyABKAsyDS5Mb2dpblJlcXVlc3RIAFIMbG9naW5SZXF1ZXN0EisKCmxvZ2luX2luZm8YECABKAsyCi5Mb2dpbkluZm9IAFIJbG9naW5JbmZvEjcKDmxvZ2luX3Jlc3BvbnNlGBEgASgLMg4uTG9naW5SZXNwb25zZUgAUg1sb2dpblJlc3BvbnNlEisKCmNsZWFyX2Rlc2sYEiABKAsyCi5DbGVhckRlc2tIAFIJY2xlYXJEZXNrEiQKB3Jlc3VsdHMYEyABKAsyCC5SZXN1bHRzSABSB3Jlc3VsdHMSKAoJdXNlcl9saXN0GBQgASgLMgkuVXNlckxpc3RIAFIIdXNlckxpc3QSNwoOa2luZ19zZWxlY3Rpb24YFSABKAsyDi5LaW5nU2VsZWN0aW9uSABSDWtpbmdTZWxlY3Rpb24SQAoRc3RhcnRfcHJlZGljdGlvbnMYFiABKAsyES5TdGFydFByZWRpY3Rpb25zSABSEHN0YXJ0UHJlZGljdGlvbnMSMAoLcHJlZGljdGlvbnMYFyABKAsyDC5QcmVkaWN0aW9uc0gAUgtwcmVkaWN0aW9ucxIxCgx0YWxvbl9yZXZlYWwYGCABKAsyDC5UYWxvblJldmVhbEgAUgt0YWxvblJldmVhbBI3Cg5wbGF5aW5nX3JldmVhbBgZIAEoCzIOLlBsYXlpbmdSZXZlYWxIAFINcGxheWluZ1JldmVhbBI6Cg90YWxvbl9zZWxlY3Rpb24YGiABKAsyDy5UYWxvblNlbGVjdGlvbkgAUg50YWxvblNlbGVjdGlvbhIeCgVzdGFzaBgbIAEoCzIGLlN0YXNoSABSBXN0YXNoEiUKCGdhbWVfZW5kGBwgASgLMgguR2FtZUVuZEgAUgdnYW1lRW5kEkcKFGdhbWVfc3RhcnRfY291bnRkb3duGB0gASgLMhMuR2FtZVN0YXJ0Q291bnRkb3duSABSEmdhbWVTdGFydENvdW50ZG93bhI9ChJwcmVkaWN0aW9uc19yZXNlbmQYHiABKAsyDC5QcmVkaWN0aW9uc0gAUhFwcmVkaWN0aW9uc1Jlc2VuZBIkCgdyYWRlbGNpGB8gASgLMgguUmFkZWxjaUgAUgdyYWRlbGNpEhsKBHRpbWUYICABKAsyBS5UaW1lSABSBHRpbWUSMQoMY2hhdF9tZXNzYWdlGCEgASgLMgwuQ2hhdE1lc3NhZ2VIAFILY2hhdE1lc3NhZ2USNAoNaW52aXRlX3BsYXllchgiIAEoCzINLkludml0ZVBsYXllckgAUgxpbnZpdGVQbGF5ZXISNwoOc3Rhc2hlZF90YXJvY2sYIyABKAsyDi5TdGFzaGVkVGFyb2NrSABSDXN0YXNoZWRUYXJvY2sSKwoKY2xlYXJfaGFuZBgkIAEoCzIKLkNsZWFySGFuZEgAUgljbGVhckhhbmQSLgoLcmVwbGF5X2xpbmsYJSABKAsyCy5SZXBsYXlMaW5rSABSCnJlcGxheUxpbmsSLgoLcmVwbGF5X21vdmUYJiABKAsyCy5SZXBsYXlNb3ZlSABSCnJlcGxheU1vdmUSQQoScmVwbGF5X3NlbGVjdF9nYW1lGCcgASgLMhEuUmVwbGF5U2VsZWN0R2FtZUgAUhByZXBsYXlTZWxlY3RHYW1lEigKCWdhbWVfaW5mbxgoIAEoCzIJLkdhbWVJbmZvSABSCGdhbWVJbmZvQgYKBGRhdGE='); +final $typed_data.Uint8List messageDescriptor = $convert.base64Decode('CgdNZXNzYWdlEhoKCHVzZXJuYW1lGAEgASgJUgh1c2VybmFtZRIbCglwbGF5ZXJfaWQYAiABKAlSCHBsYXllcklkEhYKBnNpbGVudBgEIAEoCFIGc2lsZW50Ei0KCmNvbm5lY3Rpb24YCiABKAsyCy5Db25uZWN0aW9uSABSCmNvbm5lY3Rpb24SMAoLbGljaXRpcmFuamUYCyABKAsyDC5MaWNpdGlyYW5qZUgAUgtsaWNpdGlyYW5qZRIbCgRjYXJkGAwgASgLMgUuQ2FyZEgAUgRjYXJkEkAKEWxpY2l0aXJhbmplX3N0YXJ0GA0gASgLMhEuTGljaXRpcmFuamVTdGFydEgAUhBsaWNpdGlyYW5qZVN0YXJ0EisKCmdhbWVfc3RhcnQYDiABKAsyCi5HYW1lU3RhcnRIAFIJZ2FtZVN0YXJ0EjQKDWxvZ2luX3JlcXVlc3QYDyABKAsyDS5Mb2dpblJlcXVlc3RIAFIMbG9naW5SZXF1ZXN0EisKCmxvZ2luX2luZm8YECABKAsyCi5Mb2dpbkluZm9IAFIJbG9naW5JbmZvEjcKDmxvZ2luX3Jlc3BvbnNlGBEgASgLMg4uTG9naW5SZXNwb25zZUgAUg1sb2dpblJlc3BvbnNlEisKCmNsZWFyX2Rlc2sYEiABKAsyCi5DbGVhckRlc2tIAFIJY2xlYXJEZXNrEiQKB3Jlc3VsdHMYEyABKAsyCC5SZXN1bHRzSABSB3Jlc3VsdHMSKAoJdXNlcl9saXN0GBQgASgLMgkuVXNlckxpc3RIAFIIdXNlckxpc3QSNwoOa2luZ19zZWxlY3Rpb24YFSABKAsyDi5LaW5nU2VsZWN0aW9uSABSDWtpbmdTZWxlY3Rpb24SQAoRc3RhcnRfcHJlZGljdGlvbnMYFiABKAsyES5TdGFydFByZWRpY3Rpb25zSABSEHN0YXJ0UHJlZGljdGlvbnMSMAoLcHJlZGljdGlvbnMYFyABKAsyDC5QcmVkaWN0aW9uc0gAUgtwcmVkaWN0aW9ucxIxCgx0YWxvbl9yZXZlYWwYGCABKAsyDC5UYWxvblJldmVhbEgAUgt0YWxvblJldmVhbBI3Cg5wbGF5aW5nX3JldmVhbBgZIAEoCzIOLlBsYXlpbmdSZXZlYWxIAFINcGxheWluZ1JldmVhbBI6Cg90YWxvbl9zZWxlY3Rpb24YGiABKAsyDy5UYWxvblNlbGVjdGlvbkgAUg50YWxvblNlbGVjdGlvbhIeCgVzdGFzaBgbIAEoCzIGLlN0YXNoSABSBXN0YXNoEiUKCGdhbWVfZW5kGBwgASgLMgguR2FtZUVuZEgAUgdnYW1lRW5kEkcKFGdhbWVfc3RhcnRfY291bnRkb3duGB0gASgLMhMuR2FtZVN0YXJ0Q291bnRkb3duSABSEmdhbWVTdGFydENvdW50ZG93bhI9ChJwcmVkaWN0aW9uc19yZXNlbmQYHiABKAsyDC5QcmVkaWN0aW9uc0gAUhFwcmVkaWN0aW9uc1Jlc2VuZBIkCgdyYWRlbGNpGB8gASgLMgguUmFkZWxjaUgAUgdyYWRlbGNpEhsKBHRpbWUYICABKAsyBS5UaW1lSABSBHRpbWUSMQoMY2hhdF9tZXNzYWdlGCEgASgLMgwuQ2hhdE1lc3NhZ2VIAFILY2hhdE1lc3NhZ2USNAoNaW52aXRlX3BsYXllchgiIAEoCzINLkludml0ZVBsYXllckgAUgxpbnZpdGVQbGF5ZXISNwoOc3Rhc2hlZF90YXJvY2sYIyABKAsyDi5TdGFzaGVkVGFyb2NrSABSDXN0YXNoZWRUYXJvY2sSKwoKY2xlYXJfaGFuZBgkIAEoCzIKLkNsZWFySGFuZEgAUgljbGVhckhhbmQSLgoLcmVwbGF5X2xpbmsYJSABKAsyCy5SZXBsYXlMaW5rSABSCnJlcGxheUxpbmsSLgoLcmVwbGF5X21vdmUYJiABKAsyCy5SZXBsYXlNb3ZlSABSCnJlcGxheU1vdmUSQQoScmVwbGF5X3NlbGVjdF9nYW1lGCcgASgLMhEuUmVwbGF5U2VsZWN0R2FtZUgAUhByZXBsYXlTZWxlY3RHYW1lEigKCWdhbWVfaW5mbxgoIAEoCzIJLkdhbWVJbmZvSABSCGdhbWVJbmZvEi4KC3N0YXJ0X2Vhcmx5GCkgASgLMgsuU3RhcnRFYXJseUgAUgpzdGFydEVhcmx5QgYKBGRhdGE=');