@@ -10,6 +10,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
1010import 'package:freezed_annotation/freezed_annotation.dart' ;
1111import 'package:lichess_mobile/src/model/analysis/analysis_controller.dart' ;
1212import 'package:lichess_mobile/src/model/common/chess.dart' ;
13+ import 'package:lichess_mobile/src/model/common/chess960.dart' ;
1314import 'package:lichess_mobile/src/model/common/eval.dart' ;
1415import 'package:lichess_mobile/src/model/common/id.dart' ;
1516import 'package:lichess_mobile/src/model/common/perf.dart' ;
@@ -112,13 +113,15 @@ class OfflineComputerGameController extends Notifier<OfflineComputerGameState> {
112113 required Side playerSide,
113114 required bool casual,
114115 required bool practiceMode,
116+ Variant variant = Variant .standard,
115117 String ? initialFen,
116118 }) {
117119 state = OfflineComputerGameState .initial (
118120 stockfishLevel: stockfishLevel,
119121 playerSide: playerSide,
120122 casual: casual,
121123 practiceMode: practiceMode,
124+ variant: variant,
122125 initialFen: initialFen,
123126 );
124127
@@ -383,7 +386,7 @@ class OfflineComputerGameController extends Notifier<OfflineComputerGameState> {
383386 return EvalWork (
384387 id: state.game.id,
385388 stockfishFlavor: _kComputerStockfishFlavor,
386- variant: Variant .standard ,
389+ variant: state.game.meta.variant ,
387390 threads: numberOfCoresForEvaluation,
388391 hashSize: ref.read (evaluationServiceProvider).maxMemory,
389392 searchTime: _kMoveEvalMaxSearchTime,
@@ -640,7 +643,7 @@ class OfflineComputerGameController extends Notifier<OfflineComputerGameState> {
640643
641644 final work = MoveWork (
642645 id: state.game.id,
643- variant: Variant .standard ,
646+ variant: state.game.meta.variant ,
644647 hashSize: evaluationService.maxMemory,
645648 initialPosition: state.game.initialPosition,
646649 steps: steps,
@@ -772,7 +775,7 @@ class OfflineComputerGameController extends Notifier<OfflineComputerGameState> {
772775 final work = EvalWork (
773776 id: state.game.id,
774777 stockfishFlavor: _kComputerStockfishFlavor,
775- variant: Variant .standard ,
778+ variant: state.game.meta.variant ,
776779 threads: numberOfCoresForEvaluation,
777780 hashSize: evaluationService.maxMemory,
778781 searchTime: _kHintsMaxSearchTime,
@@ -868,26 +871,42 @@ sealed class OfflineComputerGameState with _$OfflineComputerGameState {
868871 factory OfflineComputerGameState .initial ({
869872 required StockfishLevel stockfishLevel,
870873 required Side playerSide,
874+ Variant variant = Variant .standard,
871875 bool casual = true ,
872876 bool practiceMode = false ,
873877 String ? initialFen,
874878 }) {
875- final position = initialFen != null
876- ? Chess .fromSetup (Setup .parseFen (initialFen))
877- : Chess .initial;
879+ final Position position;
880+ final Variant effectiveVariant;
881+ final String ? effectiveInitialFen;
882+
883+ if (initialFen != null ) {
884+ position = Chess .fromSetup (Setup .parseFen (initialFen));
885+ effectiveVariant = Variant .fromPosition;
886+ effectiveInitialFen = initialFen;
887+ } else if (variant == Variant .chess960) {
888+ position = randomChess960Position ();
889+ effectiveVariant = Variant .chess960;
890+ effectiveInitialFen = position.fen;
891+ } else {
892+ position = variant.initialPosition;
893+ effectiveVariant = variant;
894+ effectiveInitialFen = null ;
895+ }
896+
878897 final sessionId = StringId ('ocg_${_random .nextInt (1 << 32 ).toRadixString (16 ).padLeft (8 , '0' )}' );
879898 return OfflineComputerGameState (
880899 game: OfflineComputerGame (
881900 id: sessionId,
882901 steps: [GameStep (position: position)].lock,
883902 status: GameStatus .started,
884- initialFen: initialFen ,
903+ initialFen: effectiveInitialFen ,
885904 meta: GameMeta (
886905 createdAt: DateTime .now (),
887906 rated: false ,
888- variant: initialFen != null ? Variant .fromPosition : Variant .standard ,
907+ variant: effectiveVariant ,
889908 speed: Speed .classical,
890- perf: Perf .classical,
909+ perf: Perf .fromVariantAndSpeed (effectiveVariant, Speed . classical) ,
891910 ),
892911 playerSide: playerSide,
893912 stockfishLevel: stockfishLevel,
0 commit comments