Sanmill is a free, powerful UCI-like N men's morris program with CUI, Flutter GUI and Qt GUI.

Overview

Overview

YouTube

Get it on GitHub Get it on F-Droid Get it on Google Play Get it on CafeBazaar

Build Status Codacy Badge Translation status

Sanmill is a free, powerful UCI-like N men's morris program with CUI, Flutter GUI and Qt GUI.

Nine men's morris is a strategy board game for two players dating at least to the Roman Empire. The game is also known as nine-man morris, mill, mills, the mill game, merels, merrills, merelles, marelles, morelles, and ninepenny marl in English.

image

Files

This distribution of Sanmill consists of the following files:

  • Readme.md, the file you are currently reading.

  • Copying.txt, a text file containing the GNU General Public License version 3.

  • src, a subdirectory containing the full source code, including a Makefile that can be used to compile Sanmill CUI on Unix-like systems.

  • src/ui/flutter_app, a subdirectory containing a Flutter frontend.

  • src/ui/qt, a subdirectory containing a Qt frontend.

How to Build

CUI

Sanmill CUI has support for 32 or 64-bit CPUs, certain hardware instructions, big-endian machines such as Power PC, and other platforms.

It should be easy to compile Sanmill directly from the source code on Unix-like systems with the included Makefile in the folder src. Generally, it is recommended to run make help to see a list of make targets with corresponding descriptions.

cd src
make help
make build ARCH=x86-64-modern

When reporting an issue or a bug, please tell us which version and compiler you used to create your executable. This information can be found by typing the following commands in a console:

./sanmill compiler

Qt Application

If you have started using Ubuntu or any Ubuntu-based Linux distribution, you must install Qt by running the following command as root:

sudo apt-get install qt5-default qtmultimedia5-dev qtcreator

Use Qt Creator to open millgame.pro , or use Visual Studio to open millgame.sln to build Qt Application.

Flutter App

Run ./flutter-init.sh , copy src/ui/flutter_app/android/key.properties.example to src/ui/flutter_app/android/key.properties, modify it, and then use IntelliJ IDEA or Visual Studio Code to open src/ui/flutter_app to build Flutter App.

We use compile-time environment configs to enable specific parts of the code:

  • test to prepare the app for Monkey and Appium testing. (References to external sites are going to be disabled.)
  • dev_mode to show the developer mode without needing to enable it first.
  • catcher to control the use of catcher. (This is on by default and needs to be disabled when required.)

All environment configs can be combined and take a value of bool like:

flutter run --dart-define catcher=false dev_mode=true

For ease of use, some launch configs for IntelliJ IDEA or Visual Studio Code are available. Just select the needed one in the Run and Debug or Run/Debug Configurations tab.

Understanding the code base and participating in the project

Sanmill's improvement over the last couple of years has been a great community effort. There are a few ways to help contribute to its growth.

Improving the code

If you want to help improve the code, there are several valuable resources:

  • In this wiki, many techniques used in Sanmill are explained with a lot of background information.

  • The latest source can always be found on GitHub.

  • Discussions about Sanmill take place in the Discussions.

Terms of use

Sanmill is free and distributed under the GNU General Public License version 3 (GPL v3). Essentially, this means you are free to do almost exactly what you want with the program, including distributing it among your friends, making it available for download from your website, selling it (either by itself or as part of some bigger software package), or using it as the starting point for a software project of your own.

The only real limitation is that whenever you distribute Sanmill in some way, you must always include the full source code or a pointer to where the source code can be found. If you make any changes to the source code, these changes must also be made available under the GPL.

For full details, read the copy of the GPL v3 found in the file named Copying.txt.

Comments
  • WIP: Linting and restructure

    WIP: Linting and restructure

    Hi there, I've enabled strict linting for your project. I've fixed all the linting errors and disabled the rules that needed to much restructure.

    I've also restructured the files in your repo.

    I've tested the changes on my android devices and so most works so far.

    I get a crash when trying to play against the AI. I've narrowed it down to onBoardTap but couldn't figure out the Problem. Catcher does some wired stuff so I can't use my breakpoints.

    A bit of help fixing this would be great as This PR should improve performance quite a bit

    opened by Leptopoda 66
  • Clean up Theming

    Clean up Theming

    just to inform everyone about the coming change :)

    I'm currently rewriting the entire theme stack and this PR is going to discuss changes along the way.

    This branch is currently based on #349 so we'll need to wait for that to go through.

    What needs to be addressed

    I'm currently simplifying the use of LocalDatabaseService.display (aka the Display class), the AppTheme class, the ThemeData class and some other helpers like the UIColors class. Until a sort of unified foundation has been reached the feature should not be evaluated. This PR currently removes the reactiveness of theming but the goal is to have it more reacive than before in the long term.

    Oh yes, the dark theme is somehow not in affect. I'll also address this in the future.

    opened by Leptopoda 41
  • Config rework

    Config rework

    DO NOT MERGE! this is the first proposed version for the new storage backend.

    You can audit and test the new code. Currently the migration does not seem to work so I'll debug this tomorrow.

    Also sorry for the PR in the other repo. GH auto selected it as we are still marked as a fork. As this project seems to independent we should probably remove the fork dependency all together.

    opened by Leptopoda 38
  • WIP: game logic rewrite

    WIP: game logic rewrite

    continuation of #417

    This PR aims to rewrite the game logic (in lib/mill and game_page.dart). It is still WIP as the issue mentioned in #417 still exists. Everything else should work though.

    The merge conflict is connected to #416 as I found a more elegant solution.

    known problems:

    • [x] step forward all somehow shows a bad snackbar
    • [x] ai is broken :) (see #417) [sort of fixed]
    • [x] ai hangs
    opened by Leptopoda 32
  • deprecate developer mode

    deprecate developer mode

    :scroll: Description

    removes the ability to enable the developer mode in production.

    :bulb: Motivation and Context

    We shouldn't ship it to users (performance, app size, etc) so it's hidden behind compile time configs.

    :green_heart: How did you test it?

    :pencil: Checklist

    • [x] I reviewed submitted code
    • [x] I added tests to verify changes
    • [x] I updated the docs if needed
    • [x] All tests passing
    • [x] No breaking changes

    :crystal_ball: Next steps

    opened by Leptopoda 30
  • WIP: better utilize the MillController

    WIP: better utilize the MillController

    It makes the controller a singleton and moves the recorder and tip into it.

    It also splits the game page into more widgets making it more performant and less error-prone. The tip is now handled in its separate value listenable.

    @calcitem this commit isn't the entire migration, but it will eventually fix several (if not all) issues introduced in the last PR. This significant restructure was needed to achieve this.

    To continue, I need some input from you:

    1. can you please explain what engineToGo exactly does? This is the function that blocks fixing the above-mentioned errors.
    2. it seems like you pass the engine (cpp) the fen representation of the board on each move. But you only pass it recorder.lastPositionWithRemove. This is not always the same as the fen representation of the current board. The most recent one could be obtained by position._fen. I've played a game and logged both versions:
    I/flutter ( 1413): debug old: ********/********/******** w p p 0 9 0 9 0 0 1
    I/flutter ( 1413): debug fen: ********/********/***O**** b p p 1 8 0 9 0 1 1
    I/flutter ( 1413): debug old: ********/********/******** w p p 0 9 0 9 0 0 1
    I/flutter ( 1413): debug fen: ********/@*******/**OO**** b p p 2 7 1 8 0 1 2
    I/flutter ( 1413): debug old: ********/******@*/*OOO**** b p p 3 6 1 7 0 1 3
    I/flutter ( 1413): debug fen: ********/******@*/*OOO**** b p p 3 6 1 7 0 1 3
    I/flutter ( 1413): debug old: ********/******@*/*OOO**** b p p 3 6 1 7 0 1 3
    I/flutter ( 1413): debug fen: ********/****@*@*/OOOO**** b p p 4 5 2 6 0 1 4
    I/flutter ( 1413): debug old: ********/****@*@*/OOOO***O b p p 5 4 2 5 0 1 6
    I/flutter ( 1413): debug fen: ********/****@*@*/OOOO***O b p p 5 4 2 5 0 1 6
    I/flutter ( 1413): debug old: ********/****@*@*/OOOO***O b p p 5 4 2 5 0 1 6
    I/flutter ( 1413): debug fen: ********/**@*@*@*/OOOO**OO b p p 6 3 3 4 0 1 7
    I/flutter ( 1413): debug old: ********/@*@*@***/OOOO*OOO b p p 7 2 3 3 0 1 8
    I/flutter ( 1413): debug fen: ********/@*@*@***/OOOO*OOO b p p 7 2 3 3 0 1 8
    I/flutter ( 1413): debug old: ********/@*@***@*/OOOOOOOO b p p 8 1 3 2 0 1 10
    I/flutter ( 1413): debug fen: ********/@*@***@*/OOOOOOOO b p p 8 1 3 2 0 1 10
    I/flutter ( 1413): debug old: ********/@*@***@*/OOOOOOOO b p p 8 1 3 2 0 1 10
    I/flutter ( 1413): debug fen: *****O**/@*@*@*@*/OOOOOOOO b p p 9 0 4 1 0 1 11
    I/flutter ( 1413): debug old: ********/@*@***@*/OOOOOOOO b p p 8 1 3 2 0 1 10
    I/flutter ( 1413): debug fen: ****O*@*/@*@*@*@*/OOOOOOOO b m s 9 0 5 0 0 3 12
    I/flutter ( 1413): debug old: ********/@*@***@*/OOOOOOOO b p p 8 1 3 2 0 1 10
    I/flutter ( 1413): debug fen: ***O**@*/@*@*@**@/OOOOOOOO b m s 9 0 5 0 0 8 14
    I/flutter ( 1413): debug old: ********/@*@***@*/OOOOOOOO b p p 8 1 3 2 0 1 10
    I/flutter ( 1413): debug fen: ***O**@*/@@**@**@/OOOOOOOO b m r 9 0 5 0 1 10 14
    I/flutter ( 1413): debug old: ******@*/@@**@**@/OOOOOOOO w m s 8 0 5 0 0 0 15
    I/flutter ( 1413): debug fen: ******@*/@@O*@**@/OO*OOOOO b m s 8 0 5 0 0 3 16
    I/flutter ( 1413): debug old: ******@*/*@**@*@*/OOOOOOOO b m s 8 0 4 0 0 1 18
    I/flutter ( 1413): debug fen: ******@*/*@**@*@*/OOOOOOOO b m s 8 0 4 0 0 1 18
    I/flutter ( 1413): debug old: ******@*/*@**@*@*/OOOOOOOO b m s 8 0 4 0 0 1 18
    I/flutter ( 1413): debug fen: ******@*/O*@*@*@*/*OOOOOOO b m s 8 0 4 0 0 6 20
    I/flutter ( 1413): debug old: ******@*/****@*@*/OOOOOOOO b m s 8 0 3 0 0 1 22
    I/flutter ( 1413): debug fen: ******@*/****@*@*/OOOOOOOO b m s 8 0 3 0 0 1 22
    I/flutter ( 1413): debug old: ******@*/****@*@*/OOOOOOOO b m s 8 0 3 0 0 1 22
    I/flutter ( 1413): debug fen: @*****@*/O*****@*/*OOOOOOO b m s 8 0 3 0 0 6 23
    I/flutter ( 1413): debug old: ******@*/****@*@*/OOOOOOOO b m s 8 0 3 0 0 1 22
    I/flutter ( 1413): debug fen: @*****@*/O*O*****/@O*OOOOO b m s 8 0 3 0 0 11 25
    I/flutter ( 1413): debug old: ******@*/****@*@*/OOOOOOOO b m s 8 0 3 0 0 1 22
    I/flutter ( 1413): debug fen: @*******/O*O*O***/@O@O*OOO b m s 8 0 3 0 0 16 26
    

    In this log, the "old" one is the fen stored in the recorder, and the "fen" is the one stored in position. You can clearly see that the old one lacks behind quite a bit (it only gets updated when a piece is being removed). IMO the engine should always have the most recent one. Is this right?

    opened by Leptopoda 26
  • Build runner asset generation

    Build runner asset generation

    implements assets generation eliminating the possibility of wrong resource locations. #303

    You could cherrypick the commit as it is ready to be merged. It's just based on #284 rn.

    We should also document the use of buildrunner or implement it in flutter-init.shfor now (althought the goal is to eventually migrate everything to buildrunner and away from the custom script)

    opened by Leptopoda 22
  • [Meta] Code celanup ideas

    [Meta] Code celanup ideas

    So we don't forget our discussed TODOs from #284:

    • [x] JsonSerializable for the config/preference/settings saving

    • [x] flutter gen_l10n this is an arb parser built into flutter

    • [x] use showLicensePage for the licence page

    • [ ] remove need for flutter-init.sh script (the above two will do most of it)

    • [x] migrate theeming into the ThemeDatacalss and access it via Theme.of(context)

    • [x] reactive programming. Use Provider or ValueLIsteners instead of static fields (especially for config/settings/preference) this will allow us to access those just like theme via Settings.of(context) listeners should be added where needed to update the UI (this might be needed for JsonSerializable aswell)

    • [x] go through null safety (the current builds are null safe but there are a lot of values we could make better null aware)

    • [x] Build types/settings (following stuff shouldn't be needed in the production build)

      • developer mode
      • advanced debuging utilities (as we log quite a bit we could get performance problems)
    • [ ] migrate to dart_ffi and ffi_gen for the platform interfce. This will enable easier builds as the dart build system could compile the C code and we wouldn't need to add many extra settings for iOS, Linux etc.

    EDIT:

    • [x] restructure used Icons. I don't know how FluentIconsis implemented but adding custom icons usually means another font that's added to the app. This leads to larger apk sizes. We could use material icons or segmentize the used ones
    • [x] refractor the splash screen. As said by the compiler the current splash screen implementation is deprecated.
    • [x] refractor storage backend. Maybe something like hive?
    • [x] rework the android flutter binding (the gradle linter says that enable-R8 is deprecated as R8 is enabled by default. Also some kotlin stuff.) related to the splashscreen thingy
    • [x] refractor the drawer. We currently maintain our own drawer implementation. as seen in #316 this can lead to some problems. We should either rewrite it or use a lib for this.
    • [x] use IndexedStack for the home screen view. This might need a bit more resources but as the screens are allready build switching between (using the drawer) should be more performant althought the switching is more performat the resource usage is to high
    • [x] remove the duplicate rules classes
    • [x] use directional propperties so we don't need to check rtl/ltr manually
    • [x] delete unused overrides on the game page
    • [x] rework privacy page
    • [x] remove dead code and unused parameters (make things private so the linter will find them
    • [x] better utilize arb's localization features (variables, pluralization, etc)
    • [x] better utilize our compile time configs. (disable developer mode in production ...)#
    • [x] extends our enums dart doesn't let us add methods to enums but we can still extend them :) (just stumbled over this in java and I quite miss it now xP)
    • [x] unify string notation ("" or '') the first is prefered as we don't need to escape ' in that case
    • [ ] remove uneeded files (in l10n and other dirs)
    • [ ] Reactive font scaling #400

    Performance

    • [x] Use repaint boundary
    • [x] use should repaint
    • [x] let the gamePage get the engine type from the gameInstance so it doesn't need it as a parameter

    Anything I missed?

    opened by Leptopoda 18
  • ساعدنا في الترجمة Want to help translate Sanmill?

    ساعدنا في الترجمة Want to help translate Sanmill?

    Those interested in lending a hand for their completion or for improving existing translations are encouraged to contribute via https://poeditor.com/join/project?hash=DStQiKAsPb

    Would you please click on the language you want to proofread and directly modify the corresponding entry to participate in translation proofreading? After completion, you can click "Notify Contributors" or leave a message here to inform us that we will apply the updated translation to the App. If you have any questions about the purpose of the original entry, you can add a comment, and we will get back to you!

    opened by calcitem 18
  • Commit 2c539c5  is very easy to cause native crash

    Commit 2c539c5 is very easy to cause native crash

    Commit 2c539c50b1754cad6b064baee0d4b98dd1e00f9c

    When a problem occurs, the AI will always time out after restarting the app. Only exit the app and reinstall it to solve the problem.

    No way to reproduce has been found yet.

    Crash when restoring to default settings

    I/flutter (24555): [engine] send: setoption name DeveloperMode value false
    I/flutter (24555): [engine] send: setoption name Algorithm value Algorithms.MTDf
    I/flutter (24555): [engine] send: setoption name DrawOnHumanExperience value true
    I/flutter (24555): [engine] send: setoption name ConsiderMobility value true
    I/flutter (24555): [engine] send: setoption name SkillLevel value 1
    I/flutter (24555): [engine] send: setoption name MoveTime value 1
    I/flutter (24555): [engine] send: setoption name AiIsLazy value false
    I/flutter (24555): [engine] send: setoption name Shuffling value true
    I/flutter (24555): [engine] send: setoption name PiecesCount value 9
    I/flutter (24555): [engine] send: setoption name FlyPieceCount value 3
    I/flutter (24555): [engine] send: setoption name PiecesAtLeastCount value 3
    I/flutter (24555): [engine] send: setoption name HasDiagonalLines value false
    I/flutter (24555): [engine] send: setoption name HasBannedLocations value false
    I/flutter (24555): [engine] send: setoption name MayMoveInPlacingPhase value false
    I/flutter (24555): [engine] send: setoption name IsDefenderMoveFirst value false
    I/flutter (24555): [engine] send: setoption name MayRemoveMultiple value false
    I/flutter (24555): [engine] send: setoption name MayRemoveFromMillsAlways value false
    I/flutter (24555): [engine] send: setoption name MayOnlyRemoveUnplacedPieceInPlacingPhase value false
    I/flutter (24555): [engine] send: setoption name IsWhiteLoseButNotDrawWhenBoardFull value true
    I/flutter (24555): [engine] send: setoption name IsLoseButNotChangeSideWhenNoWay value true
    I/flutter (24555): [engine] send: setoption name MayFly value true
    I/flutter (24555): [engine] send: setoption name NMoveRule value 100
    I/flutter (24555): [engine] send: setoption name EndgameNMoveRule value 100
    I/flutter (24555): [engine] send: setoption name ThreefoldRepetitionRule value true
    I/flutter (24555): [game_page] reloaded engine options
    I/flutter (24555): [game_page] Engine type: EngineType.humanVsAi
    I/flutter (24555): [game] White is AI? false
    I/flutter (24555): [game] Black is AI? true
    I/flutter (24555): 
    D/MillEngine(24555): println: uciok
    D/MillEngine(24555): [uci] input: setoption name DeveloperMode value false
    D/MillEngine(24555): [uci] input: setoption name Algorithm value Algorithms.MTDf
    E/libc++abi(24555): terminating with uncaught exception of type std::invalid_argument: stof: no conversion
    D/xCrash  (24555): xCrash log path: /storage/emulated/0/Android/data/com.calcitem.sanmill/files/xcrash/tombstone_00001638204968511255_3.0.0__com.calcitem.sanmill.native.xcrash, emergency: (null)
    D/xCrash  (24555): xCrash log files have been written
    F/libc    (24555): Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 24724 (alcitem.sanmill), pid 24555 (alcitem.sanmill)
    *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    Build fingerprint: 'google/redfin/redfin:12/SP1A.211105.003/7757856:user/release-keys'
    Revision: 'MP1.0'
    ABI: 'arm64'
    Timestamp: 2021-11-30 00:56:25.994480439+0800
    Process uptime: 0s
    Cmdline: com.calcitem.sanmill
    pid: 24555, tid: 24724, name: alcitem.sanmill  >>> com.calcitem.sanmill <<<
    uid: 10326
    signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
    Abort message: 'terminating with uncaught exception of type std::invalid_argument: stof: no conversion'
        x0  0000000000000000  x1  0000000000006094  x2  0000000000000006  x3  00000078ab6f9f70
        x4  736f646277641f73  x5  736f646277641f73  x6  736f646277641f73  x7  7f7f7f7f7f7f7f7f
        x8  00000000000000f0  x9  90f1a2e4b533fb98  x10 0000000000000000  x11 ffffff80fffffbdf
        x12 0000000000000001  x13 0000000100000000  x14 0000000000000010  x15 0000000000000000
        x16 0000007bf9d4b050  x17 0000007bf9d27eb0  x18 00000078a182e000  x19 0000000000005feb
        x20 0000000000006094  x21 00000000ffffffff  x22 ffffff80ffffffc8  x23 00000078ab6fa1c0
        x24 00000078ab6fa0a0  x25 00000078ab6fa0e0  x26 b4000079d8bf3f50  x27 00000078ab6faa60
        x28 00000078ab6fc000  x29 00000078ab6f9ff0
        lr  0000007bf9cdaba0  sp  00000078ab6f9f50  pc  0000007bf9cdabcc  pst 0000000000001000
    backtrace:
          #00 pc 000000000004fbcc  /apex/com.android.runtime/lib64/bionic/libc.so (abort+164) (BuildId: ba489d4985c0cf173209da67405662f9)
          #01 pc 00000000000ab820  /data/app/~~Xue71ZPtjg_l4Anm0858IQ==/com.calcitem.sanmill-PG9odJAMdHv7IZ38Vfkgag==/lib/arm64/libsanmill.so (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #02 pc 00000000000ab978  /data/app/~~Xue71ZPtjg_l4Anm0858IQ==/com.calcitem.sanmill-PG9odJAMdHv7IZ38Vfkgag==/lib/arm64/libsanmill.so (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #03 pc 00000000000a8868  /data/app/~~Xue71ZPtjg_l4Anm0858IQ==/com.calcitem.sanmill-PG9odJAMdHv7IZ38Vfkgag==/lib/arm64/libsanmill.so (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #04 pc 00000000000a7e94  /data/app/~~Xue71ZPtjg_l4Anm0858IQ==/com.calcitem.sanmill-PG9odJAMdHv7IZ38Vfkgag==/lib/arm64/libsanmill.so (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #05 pc 00000000000a7df0  /data/app/~~Xue71ZPtjg_l4Anm0858IQ==/com.calcitem.sanmill-PG9odJAMdHv7IZ38Vfkgag==/lib/arm64/libsanmill.so (__cxa_throw+112) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #06 pc 00000000000a32b4  /data/app/~~Xue71ZPtjg_l4Anm0858IQ==/com.calcitem.sanmill-PG9odJAMdHv7IZ38Vfkgag==/lib/arm64/libsanmill.so (std::__ndk1::stof(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, unsigned long*)+372) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #07 pc 0000000000062604  /data/app/~~Xue71ZPtjg_l4Anm0858IQ==/com.calcitem.sanmill-PG9odJAMdHv7IZ38Vfkgag==/lib/arm64/libsanmill.so (UCI::Option::operator=(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)+1044) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #08 pc 000000000005da30  /data/app/~~Xue71ZPtjg_l4Anm0858IQ==/com.calcitem.sanmill-PG9odJAMdHv7IZ38Vfkgag==/lib/arm64/libsanmill.so (UCI::loop(int, char**)+2064) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #09 pc 000000000004c294  /data/app/~~Xue71ZPtjg_l4Anm0858IQ==/com.calcitem.sanmill-PG9odJAMdHv7IZ38Vfkgag==/lib/arm64/libsanmill.so (main+344) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #10 pc 000000000004b140  /data/app/~~Xue71ZPtjg_l4Anm0858IQ==/com.calcitem.sanmill-PG9odJAMdHv7IZ38Vfkgag==/lib/arm64/libsanmill.so (engineThread+20) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #11 pc 00000000000b1910  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+264) (BuildId: ba489d4985c0cf173209da67405662f9)
          #12 pc 00000000000513f0  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: ba489d4985c0cf173209da67405662f9)
    Lost connection to device.
    

    Restore to the default settings, restart app, when tapping the board, crash:

    I/flutter (26546): [game_page] Engine type: EngineType.humanVsAi
    I/flutter (26546): [game] White is AI? false
    I/flutter (26546): [game] Black is AI? true
    I/flutter (26546): 
    D/MillEngine(26546): println: uciok
    D/MillEngine(26546): [uci] input: setoption name DeveloperMode value false
    D/MillEngine(26546): [uci] input: setoption name Algorithm value Algorithms.MTDf
    E/libc++abi(26546): terminating with uncaught exception of type std::invalid_argument: stof: no conversion
    D/xCrash  (26546): xCrash log path: /storage/emulated/0/Android/data/com.calcitem.sanmill/files/xcrash/tombstone_00001638205524477996_3.0.0__com.calcitem.sanmill.native.xcrash, emergency: (null)
    D/xCrash  (26546): xCrash log files have been written
    F/libc    (26546): Fatal signal 6 (SIGABRT), code -1 (SI_QUEUE) in tid 27148 (alcitem.sanmill), pid 26546 (alcitem.sanmill)
    *** *** *** *** *** *** *** *** *** *** *** *** *** *** *** ***
    Build fingerprint: 'google/redfin/redfin:12/SP1A.211105.003/7757856:user/release-keys'
    Revision: 'MP1.0'
    ABI: 'arm64'
    Timestamp: 2021-11-30 01:12:28.106901752+0800
    Process uptime: 0s
    Cmdline: com.calcitem.sanmill
    pid: 26546, tid: 27148, name: alcitem.sanmill  >>> com.calcitem.sanmill <<<
    uid: 10327
    signal 6 (SIGABRT), code -1 (SI_QUEUE), fault addr --------
    Abort message: 'terminating with uncaught exception of type std::invalid_argument: stof: no conversion'
        x0  0000000000000000  x1  0000000000006a0c  x2  0000000000000006  x3  0000007940479f70
        x4  736f646277641f73  x5  736f646277641f73  x6  736f646277641f73  x7  7f7f7f7f7f7f7f7f
        x8  00000000000000f0  x9  90f1a2e4b533fb98  x10 0000000000000000  x11 ffffff80fffffbdf
        x12 0000000000000001  x13 0000000100000000  x14 0000000000000010  x15 0000000000000000
        x16 0000007bf9d4b050  x17 0000007bf9d27eb0  x18 000000789dabc000  x19 00000000000067b2
        x20 0000000000006a0c  x21 00000000ffffffff  x22 ffffff80ffffffc8  x23 000000794047a1c0
        x24 000000794047a0a0  x25 000000794047a0e0  x26 b4000079d8bfdc10  x27 000000794047aa60
        x28 000000794047c000  x29 0000007940479ff0
        lr  0000007bf9cdaba0  sp  0000007940479f50  pc  0000007bf9cdabcc  pst 0000000000000000
    backtrace:
          #00 pc 000000000004fbcc  /apex/com.android.runtime/lib64/bionic/libc.so (abort+164) (BuildId: ba489d4985c0cf173209da67405662f9)
          #01 pc 00000000000ab820  /data/app/~~PIJBQRjwkpPQpwHey6Rqew==/com.calcitem.sanmill-33pMSjwZoouhUAdE6L5Qmw==/lib/arm64/libsanmill.so (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #02 pc 00000000000ab978  /data/app/~~PIJBQRjwkpPQpwHey6Rqew==/com.calcitem.sanmill-33pMSjwZoouhUAdE6L5Qmw==/lib/arm64/libsanmill.so (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #03 pc 00000000000a8868  /data/app/~~PIJBQRjwkpPQpwHey6Rqew==/com.calcitem.sanmill-33pMSjwZoouhUAdE6L5Qmw==/lib/arm64/libsanmill.so (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #04 pc 00000000000a7e94  /data/app/~~PIJBQRjwkpPQpwHey6Rqew==/com.calcitem.sanmill-33pMSjwZoouhUAdE6L5Qmw==/lib/arm64/libsanmill.so (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #05 pc 00000000000a7df0  /data/app/~~PIJBQRjwkpPQpwHey6Rqew==/com.calcitem.sanmill-33pMSjwZoouhUAdE6L5Qmw==/lib/arm64/libsanmill.so (__cxa_throw+112) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #06 pc 00000000000a32b4  /data/app/~~PIJBQRjwkpPQpwHey6Rqew==/com.calcitem.sanmill-33pMSjwZoouhUAdE6L5Qmw==/lib/arm64/libsanmill.so (std::__ndk1::stof(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&, unsigned long*)+372) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #07 pc 0000000000062604  /data/app/~~PIJBQRjwkpPQpwHey6Rqew==/com.calcitem.sanmill-33pMSjwZoouhUAdE6L5Qmw==/lib/arm64/libsanmill.so (UCI::Option::operator=(std::__ndk1::basic_string<char, std::__ndk1::char_traits<char>, std::__ndk1::allocator<char> > const&)+1044) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #08 pc 000000000005da30  /data/app/~~PIJBQRjwkpPQpwHey6Rqew==/com.calcitem.sanmill-33pMSjwZoouhUAdE6L5Qmw==/lib/arm64/libsanmill.so (UCI::loop(int, char**)+2064) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #09 pc 000000000004c294  /data/app/~~PIJBQRjwkpPQpwHey6Rqew==/com.calcitem.sanmill-33pMSjwZoouhUAdE6L5Qmw==/lib/arm64/libsanmill.so (main+344) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #10 pc 000000000004b140  /data/app/~~PIJBQRjwkpPQpwHey6Rqew==/com.calcitem.sanmill-33pMSjwZoouhUAdE6L5Qmw==/lib/arm64/libsanmill.so (engineThread+20) (BuildId: 84c12802e87f736c63c77f253f735ee6580f6a9c)
          #11 pc 00000000000b1910  /apex/com.android.runtime/lib64/bionic/libc.so (__pthread_start(void*)+264) (BuildId: ba489d4985c0cf173209da67405662f9)
          #12 pc 00000000000513f0  /apex/com.android.runtime/lib64/bionic/libc.so (__start_thread+64) (BuildId: ba489d4985c0cf173209da67405662f9)
    Lost connection to device.
    
    bug 
    opened by calcitem 16
  • About page: Remove copyright text and show Git commit on about dialog

    About page: Remove copyright text and show Git commit on about dialog

    This repository ("Code - OSS") is where Calcitem develops the Sanmill product together with the community, not only Calcitem. So need to remove the copyright text.

    Show Git branch and revision on about dialog.

    opened by calcitem 12
  • Horizontal and vertical screen switching

    Horizontal and vertical screen switching

    :scroll: Description

    :bulb: Motivation and Context

    :green_heart: How did you test it?

    :pencil: Checklist

    • [ ] I reviewed submitted code
    • [ ] I added tests to verify changes
    • [ ] I updated the docs if needed
    • [ ] All tests passing
    • [ ] No breaking changes

    :crystal_ball: Next steps

    opened by xshiwei 0
  • LateInitializationError: Local 'blurPositionColor' has not been initialized.

    LateInitializationError: Local 'blurPositionColor' has not been initialized.

    /flutter (32516): [2022-12-30 00:41:47.346284 | Catcher | INFO] buildNumber: 3205
    I/flutter (32516): [2022-12-30 00:41:47.346284 | Catcher | INFO] buildNumber: 3205
    I/flutter (32516): [2022-12-30 00:41:47.346382 | Catcher | INFO] packageName: com.calcitem.sanmill
    I/flutter (32516): [2022-12-30 00:41:47.346382 | Catcher | INFO] packageName: com.calcitem.sanmill
    I/flutter (32516): [2022-12-30 00:41:47.346514 | Catcher | INFO] 
    I/flutter (32516): [2022-12-30 00:41:47.346514 | Catcher | INFO] 
    I/flutter (32516): [2022-12-30 00:41:47.346640 | Catcher | INFO] ---------- ERROR ----------
    I/flutter (32516): [2022-12-30 00:41:47.346640 | Catcher | INFO] ---------- ERROR ----------
    I/flutter (32516): [2022-12-30 00:41:47.346786 | Catcher | INFO] LateInitializationError: Local 'blurPositionColor' has not been initialized.
    I/flutter (32516): [2022-12-30 00:41:47.346786 | Catcher | INFO] LateInitializationError: Local 'blurPositionColor' has not been initialized.
    I/flutter (32516): [2022-12-30 00:41:47.346935 | Catcher | INFO] 
    I/flutter (32516): [2022-12-30 00:41:47.346935 | Catcher | INFO] 
    I/flutter (32516): [2022-12-30 00:41:47.347485 | Catcher | INFO] ------- STACK TRACE -------
    I/flutter (32516): [2022-12-30 00:41:47.347485 | Catcher | INFO] ------- STACK TRACE -------
    I/flutter (32516): [2022-12-30 00:41:47.348437 | Catcher | INFO] #0      LateError._throwLocalNotInitialized (dart:_internal-patch/internal_patch.dart:199:5)
    I/flutter (32516): [2022-12-30 00:41:47.348437 | Catcher | INFO] #0      LateError._throwLocalNotInitialized (dart:_internal-patch/internal_patch.dart:199:5)
    I/flutter (32516): [2022-12-30 00:41:47.348612 | Catcher | INFO] #1      PiecePainter.paint (package:sanmill/shared/painters/src/piece_painter.dart:154:21)
    I/flutter (32516): [2022-12-30 00:41:47.348612 | Catcher | INFO] #1      PiecePainter.paint (package:sanmill/shared/painters/src/piece_painter.dart:154:21)
    I/flutter (32516): [2022-12-30 00:41:47.348781 | Catcher | INFO] #2      RenderCustomPaint._paintWithPainter (package:flutter/src/rendering/custom_paint.dart:571:13)
    I/flutter (32516): [2022-12-30 00:41:47.348781 | Catcher | INFO] #2      RenderCustomPaint._paintWithPainter (package:flutter/src/rendering/custom_paint.dart:571:13)
    I/flutter (32516): [2022-12-30 00:41:47.348870 | Catcher | INFO] #3      RenderCustomPaint.paint (package:flutter/src/rendering/custom_paint.dart:618:7)
    I/flutter (32516): [2022-12-30 00:41:47.348870 | Catcher | INFO] #3      RenderCustomPaint.paint (package:flutter/src/rendering/custom_paint.dart:618:7)
    I/flutter (32516): [2022-12-30 00:41:47.348982 | Catcher | INFO] #4      RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.348982 | Catcher | INFO] #4      RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.349115 | Catcher | INFO] #5      PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.349115 | Catcher | INFO] #5      PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.349242 | Catcher | INFO] #6      RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.349242 | Catcher | INFO] #6      RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.349377 | Catcher | INFO] #7      RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.349377 | Catcher | INFO] #7      RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.349490 | Catcher | INFO] #8      PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.349490 | Catcher | INFO] #8      PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.349836 | Catcher | INFO] #9      RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.349836 | Catcher | INFO] #9      RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.349956 | Catcher | INFO] #10     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.349956 | Catcher | INFO] #10     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.350119 | Catcher | INFO] #11     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.350119 | Catcher | INFO] #11     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.350234 | Catcher | INFO] #12     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.350234 | Catcher | INFO] #12     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.350318 | Catcher | INFO] #13     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.350318 | Catcher | INFO] #13     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.350408 | Catcher | INFO] #14     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.350408 | Catcher | INFO] #14     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.350515 | Catcher | INFO] #15     _RenderLayoutBuilder.paint (package:flutter/src/widgets/layout_builder.dart:341:15)
    I/flutter (32516): [2022-12-30 00:41:47.350515 | Catcher | INFO] #15     _RenderLayoutBuilder.paint (package:flutter/src/widgets/layout_builder.dart:341:15)
    I/flutter (32516): [2022-12-30 00:41:47.350668 | Catcher | INFO] #16     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.350668 | Catcher | INFO] #16     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.350814 | Catcher | INFO] #17     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.350814 | Catcher | INFO] #17     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.351006 | Catcher | INFO] #18     RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2900:15)
    I/flutter (32516): [2022-12-30 00:41:47.351006 | Catcher | INFO] #18     RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2900:15)
    I/flutter (32516): [2022-12-30 00:41:47.351228 | Catcher | INFO] #19     RenderFlex.paint (package:flutter/src/rendering/flex.dart:1088:7)
    I/flutter (32516): [2022-12-30 00:41:47.351228 | Catcher | INFO] #19     RenderFlex.paint (package:flutter/src/rendering/flex.dart:1088:7)
    I/flutter (32516): [2022-12-30 00:41:47.351319 | Catcher | INFO] #20     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.351319 | Catcher | INFO] #20     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.351414 | Catcher | INFO] #21     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.351414 | Catcher | INFO] #21     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.351533 | Catcher | INFO] #22     _RenderSingleChildViewport.paint.paintContents (package:flutter/src/widgets/single_child_scroll_view.dart:562:17)
    I/flutter (32516): [2022-12-30 00:41:47.351533 | Catcher | INFO] #22     _RenderSingleChildViewport.paint.paintContents (package:flutter/src/widgets/single_child_scroll_view.dart:562:17)
    I/flutter (32516): [2022-12-30 00:41:47.351645 | Catcher | INFO] #23     _RenderSingleChildViewport.paint (package:flutter/src/widgets/single_child_scroll_view.dart:576:9)
    I/flutter (32516): [2022-12-30 00:41:47.351645 | Catcher | INFO] #23     _RenderSingleChildViewport.paint (package:flutter/src/widgets/single_child_scroll_view.dart:576:9)
    I/flutter (32516): [2022-12-30 00:41:47.351740 | Catcher | INFO] #24     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.351740 | Catcher | INFO] #24     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.351860 | Catcher | INFO] #25     PaintingContext._repaintCompositedChild (package:flutter/src/rendering/object.dart:155:11)
    I/flutter (32516): [2022-12-30 00:41:47.351860 | Catcher | INFO] #25     PaintingContext._repaintCompositedChild (package:flutter/src/rendering/object.dart:155:11)
    I/flutter (32516): [2022-12-30 00:41:47.351946 | Catcher | INFO] #26     PaintingContext.repaintCompositedChild (package:flutter/src/rendering/object.dart:98:5)
    I/flutter (32516): [2022-12-30 00:41:47.351946 | Catcher | INFO] #26     PaintingContext.repaintCompositedChild (package:flutter/src/rendering/object.dart:98:5)
    I/flutter (32516): [2022-12-30 00:41:47.352136 | Catcher | INFO] #27     PaintingContext._compositeChild (package:flutter/src/rendering/object.dart:250:7)
    I/flutter (32516): [2022-12-30 00:41:47.352136 | Catcher | INFO] #27     PaintingContext._compositeChild (package:flutter/src/rendering/object.dart:250:7)
    I/flutter (32516): [2022-12-30 00:41:47.352309 | Catcher | INFO] #28     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:231:7)
    I/flutter (32516): [2022-12-30 00:41:47.352309 | Catcher | INFO] #28     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:231:7)
    I/flutter (32516): [2022-12-30 00:41:47.352396 | Catcher | INFO] #29     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.352396 | Catcher | INFO] #29     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.352582 | Catcher | INFO] #30     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.352582 | Catcher | INFO] #30     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.352677 | Catcher | INFO] #31     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.352677 | Catcher | INFO] #31     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.352822 | Catcher | INFO] #32     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.352822 | Catcher | INFO] #32     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.352913 | Catcher | INFO] #33     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.352913 | Catcher | INFO] #33     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.353078 | Catcher | INFO] #34     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.353078 | Catcher | INFO] #34     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.353323 | Catcher | INFO] #35     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.353323 | Catcher | INFO] #35     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.353496 | Catcher | INFO] #36     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.353496 | Catcher | INFO] #36     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.353617 | Catcher | INFO] #37     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.353617 | Catcher | INFO] #37     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.353709 | Catcher | INFO] #38     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.353709 | Catcher | INFO] #38     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.353835 | Catcher | INFO] #39     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.353835 | Catcher | INFO] #39     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.354063 | Catcher | INFO] #40     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.354063 | Catcher | INFO] #40     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.354157 | Catcher | INFO] #41     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.354157 | Catcher | INFO] #41     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.354246 | Catcher | INFO] #42     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.354246 | Catcher | INFO] #42     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.354358 | Catcher | INFO] #43     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.354358 | Catcher | INFO] #43     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.354442 | Catcher | INFO] #44     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.354442 | Catcher | INFO] #44     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.354533 | Catcher | INFO] #45     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.354533 | Catcher | INFO] #45     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.354620 | Catcher | INFO] #46     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.354620 | Catcher | INFO] #46     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.354789 | Catcher | INFO] #47     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.354789 | Catcher | INFO] #47     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.354896 | Catcher | INFO] #48     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.354896 | Catcher | INFO] #48     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.354984 | Catcher | INFO] #49     PaintingContext._repaintCompositedChild (package:flutter/src/rendering/object.dart:155:11)
    I/flutter (32516): [2022-12-30 00:41:47.354984 | Catcher | INFO] #49     PaintingContext._repaintCompositedChild (package:flutter/src/rendering/object.dart:155:11)
    I/flutter (32516): [2022-12-30 00:41:47.355133 | Catcher | INFO] #50     PaintingContext.repaintCompositedChild (package:flutter/src/rendering/object.dart:98:5)
    I/flutter (32516): [2022-12-30 00:41:47.355133 | Catcher | INFO] #50     PaintingContext.repaintCompositedChild (package:flutter/src/rendering/object.dart:98:5)
    I/flutter (32516): [2022-12-30 00:41:47.355216 | Catcher | INFO] #51     PaintingContext._compositeChild (package:flutter/src/rendering/object.dart:250:7)
    I/flutter (32516): [2022-12-30 00:41:47.355216 | Catcher | INFO] #51     PaintingContext._compositeChild (package:flutter/src/rendering/object.dart:250:7)
    I/flutter (32516): [2022-12-30 00:41:47.355304 | Catcher | INFO] #52     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:231:7)
    I/flutter (32516): [2022-12-30 00:41:47.355304 | Catcher | INFO] #52     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:231:7)
    I/flutter (32516): [2022-12-30 00:41:47.355418 | Catcher | INFO] #53     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.355418 | Catcher | INFO] #53     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.355566 | Catcher | INFO] #54     RenderCustomPaint.paint (package:flutter/src/rendering/custom_paint.dart:616:11)
    I/flutter (32516): [2022-12-30 00:41:47.355566 | Catcher | INFO] #54     RenderCustomPaint.paint (package:flutter/src/rendering/custom_paint.dart:616:11)
    I/flutter (32516): [2022-12-30 00:41:47.355689 | Catcher | INFO] #55     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.355689 | Catcher | INFO] #55     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.355902 | Catcher | INFO] #56     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.355902 | Catcher | INFO] #56     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.355997 | Catcher | INFO] #57     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.355997 | Catcher | INFO] #57     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.356156 | Catcher | INFO] #58     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.356156 | Catcher | INFO] #58     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.356308 | Catcher | INFO] #59     PaintingContext._repaintCompositedChild (package:flutter/src/rendering/object.dart:155:11)
    I/flutter (32516): [2022-12-30 00:41:47.356308 | Catcher | INFO] #59     PaintingContext._repaintCompositedChild (package:flutter/src/rendering/object.dart:155:11)
    I/flutter (32516): [2022-12-30 00:41:47.356419 | Catcher | INFO] #60     PaintingContext.repaintCompositedChild (package:flutter/src/rendering/object.dart:98:5)
    I/flutter (32516): [2022-12-30 00:41:47.356419 | Catcher | INFO] #60     PaintingContext.repaintCompositedChild (package:flutter/src/rendering/object.dart:98:5)
    I/flutter (32516): [2022-12-30 00:41:47.356532 | Catcher | INFO] #61     PaintingContext._compositeChild (package:flutter/src/rendering/object.dart:250:7)
    I/flutter (32516): [2022-12-30 00:41:47.356532 | Catcher | INFO] #61     PaintingContext._compositeChild (package:flutter/src/rendering/object.dart:250:7)
    I/flutter (32516): [2022-12-30 00:41:47.356697 | Catcher | INFO] #62     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:231:7)
    I/flutter (32516): [2022-12-30 00:41:47.356697 | Catcher | INFO] #62     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:231:7)
    I/flutter (32516): [2022-12-30 00:41:47.356800 | Catcher | INFO] #63     RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2900:15)
    I/flutter (32516): [2022-12-30 00:41:47.356800 | Catcher | INFO] #63     RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2900:15)
    I/flutter (32516): [2022-12-30 00:41:47.356951 | Catcher | INFO] #64     RenderStack.paintStack (package:flutter/src/rendering/stack.dart:654:5)
    I/flutter (32516): [2022-12-30 00:41:47.356951 | Catcher | INFO] #64     RenderStack.paintStack (package:flutter/src/rendering/stack.dart:654:5)
    I/flutter (32516): [2022-12-30 00:41:47.357190 | Catcher | INFO] #65     RenderStack.paint (package:flutter/src/rendering/stack.dart:670:7)
    I/flutter (32516): [2022-12-30 00:41:47.357190 | Catcher | INFO] #65     RenderStack.paint (package:flutter/src/rendering/stack.dart:670:7)
    I/flutter (32516): [2022-12-30 00:41:47.357283 | Catcher | INFO] #66     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.357283 | Catcher | INFO] #66     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.357436 | Catcher | INFO] #67     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.357436 | Catcher | INFO] #67     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.357550 | Catcher | INFO] #68     RenderShiftedBox.paint (package:flutter/src/rendering/shifted_box.dart:84:15)
    I/flutter (32516): [2022-12-30 00:41:47.357550 | Catcher | INFO] #68     RenderShiftedBox.paint (package:flutter/src/rendering/shifted_box.dart:84:15)
    I/flutter (32516): [2022-12-30 00:41:47.357712 | Catcher | INFO] #69     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.357712 | Catcher | INFO] #69     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.357798 | Catcher | INFO] #70     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.357798 | Catcher | INFO] #70     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.357924 | Catcher | INFO] #71     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.357924 | Catcher | INFO] #71     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.358084 | Catcher | INFO] #72     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.358084 | Catcher | INFO] #72     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.358210 | Catcher | INFO] #73     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.358210 | Catcher | INFO] #73     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.358291 | Catcher | INFO] #74     _RenderLayoutBuilder.paint (package:flutter/src/widgets/layout_builder.dart:341:15)
    I/flutter (32516): [2022-12-30 00:41:47.358291 | Catcher | INFO] #74     _RenderLayoutBuilder.paint (package:flutter/src/widgets/layout_builder.dart:341:15)
    I/flutter (32516): [2022-12-30 00:41:47.358377 | Catcher | INFO] #75     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.358377 | Catcher | INFO] #75     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.358523 | Catcher | INFO] #76     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.358523 | Catcher | INFO] #76     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.358640 | Catcher | INFO] #77     RenderShiftedBox.paint (package:flutter/src/rendering/shifted_box.dart:84:15)
    I/flutter (32516): [2022-12-30 00:41:47.358640 | Catcher | INFO] #77     RenderShiftedBox.paint (package:flutter/src/rendering/shifted_box.dart:84:15)
    I/flutter (32516): [2022-12-30 00:41:47.358800 | Catcher | INFO] #78     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.358800 | Catcher | INFO] #78     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.358982 | Catcher | INFO] #79     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.358982 | Catcher | INFO] #79     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.359173 | Catcher | INFO] #80     RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2900:15)
    I/flutter (32516): [2022-12-30 00:41:47.359173 | Catcher | INFO] #80     RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2900:15)
    I/flutter (32516): [2022-12-30 00:41:47.359298 | Catcher | INFO] #81     RenderCustomMultiChildLayoutBox.paint (package:flutter/src/rendering/custom_layout.dart:415:5)
    I/flutter (32516): [2022-12-30 00:41:47.359298 | Catcher | INFO] #81     RenderCustomMultiChildLayoutBox.paint (package:flutter/src/rendering/custom_layout.dart:415:5)
    I/flutter (32516): [2022-12-30 00:41:47.359387 | Catcher | INFO] #82     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.359387 | Catcher | INFO] #82     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.359469 | Catcher | INFO] #83     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.359469 | Catcher | INFO] #83     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.359577 | Catcher | INFO] #84     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.359577 | Catcher | INFO] #84     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.359657 | Catcher | INFO] #85     _RenderInkFeatures.paint (package:flutter/src/material/material.dart:609:11)
    I/flutter (32516): [2022-12-30 00:41:47.359657 | Catcher | INFO] #85     _RenderInkFeatures.paint (package:flutter/src/material/material.dart:609:11)
    I/flutter (32516): [2022-12-30 00:41:47.359765 | Catcher | INFO] #86     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.359765 | Catcher | INFO] #86     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.359859 | Catcher | INFO] #87     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.359859 | Catcher | INFO] #87     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.359962 | Catcher | INFO] #88     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.359962 | Catcher | INFO] #88     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.360059 | Catcher | INFO] #89     RenderPhysicalModel.paint.<anonymous closure> (package:flutter/src/rendering/proxy_box.dart:2098:15)
    I/flutter (32516): [2022-12-30 00:41:47.360059 | Catcher | INFO] #89     RenderPhysicalModel.paint.<anonymous closure> (package:flutter/src/rendering/proxy_box.dart:2098:15)
    I/flutter (32516): [2022-12-30 00:41:47.360200 | Catcher | INFO] #90     PaintingContext.pushClipRRect (package:flutter/src/rendering/object.dart:550:14)
    I/flutter (32516): [2022-12-30 00:41:47.360200 | Catcher | INFO] #90     PaintingContext.pushClipRRect (package:flutter/src/rendering/object.dart:550:14)
    I/flutter (32516): [2022-12-30 00:41:47.360284 | Catcher | INFO] #91     RenderPhysicalModel.paint (package:flutter/src/rendering/proxy_box.dart:2085:21)
    I/flutter (32516): [2022-12-30 00:41:47.360284 | Catcher | INFO] #91     RenderPhysicalModel.paint (package:flutter/src/rendering/proxy_box.dart:2085:21)
    I/flutter (32516): [2022-12-30 00:41:47.360436 | Catcher | INFO] #92     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.360436 | Catcher | INFO] #92     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.360527 | Catcher | INFO] #93     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.360527 | Catcher | INFO] #93     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.360633 | Catcher | INFO] #94     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.360633 | Catcher | INFO] #94     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.360722 | Catcher | INFO] #95     RenderDecoratedBox.paint (package:flutter/src/rendering/proxy_box.dart:2371:11)
    I/flutter (32516): [2022-12-30 00:41:47.360722 | Catcher | INFO] #95     RenderDecoratedBox.paint (package:flutter/src/rendering/proxy_box.dart:2371:11)
    I/flutter (32516): [2022-12-30 00:41:47.360868 | Catcher | INFO] #96     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.360868 | Catcher | INFO] #96     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.360952 | Catcher | INFO] #97     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.360952 | Catcher | INFO] #97     PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.361127 | Catcher | INFO] #98     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.361127 | Catcher | INFO] #98     RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.361220 | Catcher | INFO] #99     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.361220 | Catcher | INFO] #99     RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.361324 | Catcher | INFO] #100    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.361324 | Catcher | INFO] #100    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.361466 | Catcher | INFO] #101    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.361466 | Catcher | INFO] #101    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.361551 | Catcher | INFO] #102    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.361551 | Catcher | INFO] #102    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.361632 | Catcher | INFO] #103    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.361632 | Catcher | INFO] #103    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.361841 | Catcher | INFO] #104    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.361841 | Catcher | INFO] #104    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.361952 | Catcher | INFO] #105    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.361952 | Catcher | INFO] #105    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.362080 | Catcher | INFO] #106    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.362080 | Catcher | INFO] #106    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.362305 | Catcher | INFO] #107    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.362305 | Catcher | INFO] #107    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.362408 | Catcher | INFO] #108    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.362408 | Catcher | INFO] #108    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.362503 | Catcher | INFO] #109    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.362503 | Catcher | INFO] #109    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.362597 | Catcher | INFO] #110    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.362597 | Catcher | INFO] #110    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.362679 | Catcher | INFO] #111    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.362679 | Catcher | INFO] #111    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.362766 | Catcher | INFO] #112    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.362766 | Catcher | INFO] #112    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.362857 | Catcher | INFO] #113    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.362857 | Catcher | INFO] #113    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.362944 | Catcher | INFO] #114    RenderFractionalTranslation.paint (package:flutter/src/rendering/proxy_box.dart:3023:13)
    I/flutter (32516): [2022-12-30 00:41:47.362944 | Catcher | INFO] #114    RenderFractionalTranslation.paint (package:flutter/src/rendering/proxy_box.dart:3023:13)
    I/flutter (32516): [2022-12-30 00:41:47.363033 | Catcher | INFO] #115    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.363033 | Catcher | INFO] #115    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.363180 | Catcher | INFO] #116    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.363180 | Catcher | INFO] #116    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.363293 | Catcher | INFO] #117    RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2900:15)
    I/flutter (32516): [2022-12-30 00:41:47.363293 | Catcher | INFO] #117    RenderBoxContainerDefaultsMixin.defaultPaint (package:flutter/src/rendering/box.dart:2900:15)
    I/flutter (32516): [2022-12-30 00:41:47.363403 | Catcher | INFO] #118    RenderStack.paintStack (package:flutter/src/rendering/stack.dart:654:5)
    I/flutter (32516): [2022-12-30 00:41:47.363403 | Catcher | INFO] #118    RenderStack.paintStack (package:flutter/src/rendering/stack.dart:654:5)
    I/flutter (32516): [2022-12-30 00:41:47.363526 | Catcher | INFO] #119    RenderStack.paint (package:flutter/src/rendering/stack.dart:670:7)
    I/flutter (32516): [2022-12-30 00:41:47.363526 | Catcher | INFO] #119    RenderStack.paint (package:flutter/src/rendering/stack.dart:670:7)
    I/flutter (32516): [2022-12-30 00:41:47.363668 | Catcher | INFO] #120    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.363668 | Catcher | INFO] #120    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.363752 | Catcher | INFO] #121    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.363752 | Catcher | INFO] #121    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.363948 | Catcher | INFO] #122    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.363948 | Catcher | INFO] #122    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.364078 | Catcher | INFO] #123    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.364078 | Catcher | INFO] #123    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.364171 | Catcher | INFO] #124    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.364171 | Catcher | INFO] #124    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.364268 | Catcher | INFO] #125    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.364268 | Catcher | INFO] #125    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.364365 | Catcher | INFO] #126    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.364365 | Catcher | INFO] #126    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.364445 | Catcher | INFO] #127    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.364445 | Catcher | INFO] #127    PaintingContext.paintChild (package:flutter/src/rendering/object.dart:239:13)
    I/flutter (32516): [2022-12-30 00:41:47.364529 | Catcher | INFO] #128    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.364529 | Catcher | INFO] #128    RenderProxyBoxMixin.paint (package:flutter/src/rendering/proxy_box.dart:144:15)
    I/flutter (32516): [2022-12-30 00:41:47.364607 | Catcher | INFO] #129    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.364607 | Catcher | INFO] #129    RenderObject._paintWithContext (package:flutter/src/rendering/object.dart:2796:7)
    I/flutter (32516): [2022-12-30 00:41:47.364698 | Catcher | INFO] #130    PaintingContext._repaintCompositedChild (package:flutter/src/rendering/object.dart:155:11)
    I/flutter (32516): [2022-12-30 00:41:47.364698 | Catcher | INFO] #130    PaintingContext._repaintCompositedChild (package:flutter/src/rendering/object.dart:155:11)
    I/flutter (32516): [2022-12-30 00:41:47.364789 | Catcher | INFO] #131    PaintingContext.repaintCompositedChild (package:flutter/src/rendering/object.dart:98:5)
    I/flutter (32516): [2022-12-30 00:41:47.364789 | Catcher | INFO] #131    PaintingContext.repaintCompositedChild (package:flutter/src/rendering/object.dart:98:5)
    I/flutter (32516): [2022-12-30 00:41:47.364873 | Catcher | INFO] #132    PipelineOwner.flushPaint (package:flutter/src/rendering/object.dart:1116:31)
    I/flutter (32516): [2022-12-30 00:41:47.364873 | Catcher | INFO] #132    PipelineOwner.flushPaint (package:flutter/src/rendering/object.dart:1116:31)
    I/flutter (32516): [2022-12-30 00:41:47.364960 | Catcher | INFO] #133    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:515:19)
    I/flutter (32516): [2022-12-30 00:41:47.364960 | Catcher | INFO] #133    RendererBinding.drawFrame (package:flutter/src/rendering/binding.dart:515:19)
    I/flutter (32516): [2022-12-30 00:41:47.365048 | Catcher | INFO] #134    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:884:13)
    I/flutter (32516): [2022-12-30 00:41:47.365048 | Catcher | INFO] #134    WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:884:13)
    I/flutter (32516): [2022-12-30 00:41:47.365128 | Catcher | INFO] #135    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1175:15)
    I/flutter (32516): [2022-12-30 00:41:47.365128 | Catcher | INFO] #135    SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1175:15)
    I/flutter (32516): [2022-12-30 00:41:47.365213 | Catcher | INFO] #136    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1104:9)
    I/flutter (32516): [2022-12-30 00:41:47.365213 | Catcher | INFO] #136    SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1104:9)
    I/flutter (32516): [2022-12-30 00:41:47.365302 | Catcher | INFO] 
    I/flutter (32516): [2022-12-30 00:41:47.365302 | Catcher | INFO] 
    I/flutter (32516): [2022-12-30 00:41:47.365543 | Catcher | INFO] ======================================================================
    I/flutter (32516): [2022-12-30 00:41:47.365543 | Catcher | INFO] ======================================================================
    I/flutter (32516): [2022-12-30 00:41:47.373125 | Catcher | INFO] Creating mail request
    I/flutter (32516): [2022-12-30 00:41:47.373125 | Catcher | INFO] Creating mail request
    I/flutter (32516): [2022-12-30 00:41:47.376709 | Catcher | INFO] Report result: true
    I/flutter (32516): [2022-12-30 00:41:47.376709 | Catcher | INFO] Report result: true
    I/flutter (32516): [2022-12-30 00:41:47.386731 | Catcher | INFO] Opened file
    I/flutter (32516): [2022-12-30 00:41:47.386731 | Catcher | INFO] Opened file
    I/flutter (32516): [2022-12-30 00:41:47.387114 | Catcher | INFO] Writing report to file
    I/flutter (32516): [2022-12-30 00:41:47.387114 | Catcher | INFO] Writing report to file
    I/flutter (32516): [2022-12-30 00:41:47.423022 | Catcher | INFO] Closed file
    I/flutter (32516): [2022-12-30 00:41:47.423022 | Catcher | INFO] Closed file
    I/flutter (32516): [2022-12-30 00:41:47.423331 | Catcher | INFO] Report result: true
    I/flutter (32516): [2022-12-30 00:41:47.423331 | Catcher | INFO] Report result: true
    D/DecorView[](32516): onWindowFocusChanged hasWindowFocus false
    D/BLASTBufferQueue(32516): releaseBufferCallback ReleaseCallbackId: bufferId:139655156596738 framenumber:7629
    E/BLASTBufferQueue(32516): [ViewRootImpl[MainActivity]#0](f:0,a:1) Applying pending transactions on dtor 1
    I/flutter (32516): [2022-12-30 00:41:52.416062 | Catcher | WARNING] Instance of 'EmailManualHandler' failed to report error because of timeout
    I/flutter (32516): [2022-12-30 00:41:52.416062 | Catcher | WARNING] Instance of 'EmailManualHandler' failed to report error because of timeout
    
    bug 
    opened by calcitem 0
  • Add board background image

    Add board background image

    :scroll: Description

    Appearance settings Added the function of setting the background picture of the chessboard

    :bulb: Motivation and Context

    :green_heart: How did you test it?

    :pencil: Checklist

    • [ ] I reviewed submitted code
    • [ ] I added tests to verify changes
    • [ ] I updated the docs if needed
    • [ ] All tests passing
    • [ ] No breaking changes

    :crystal_ball: Next steps

    opened by xshiwei 2
  • Null check operator used on a null value

    Null check operator used on a null value

            assert(_currentSquare != 0); // TODO: Deal with it
            _board[_currentSquare] =
                _grid[squareToIndex[_currentSquare]!] = PieceColor.none; // bug
    
    Error:
    
    Null check operator used on a null value
    
    Stack trace:
    
    #0 Position._putPiece (package:sanmill/services/mill/src/position.dart:525)
    #1 TapHandler.onBoardTap (package:sanmill/services/mill/src/tap_handler.dart:99)
    #2 _BoardState.build.<anonymous closure>.<anonymous closure> (package:sanmill/screens/game_page/board.dart:126)
    #3 TapGestureRecognizer.handleTapUp.<anonymous closure> (package:flutter/src/gestures/tap.dart:624)
    #4 GestureRecognizer.invokeCallback (package:flutter/src/gestures/recognizer.dart:253)
    #5 TapGestureRecognizer.handleTapUp (package:flutter/src/gestures/tap.dart:624)
    #6 BaseTapGestureRecognizer._checkUp (package:flutter/src/gestures/tap.dart:306)
    #7 BaseTapGestureRecognizer.acceptGesture (package:flutter/src/gestures/tap.dart:276)
    #8 GestureArenaManager.sweep (package:flutter/src/gestures/arena.dart:163)
    #9 GestureBinding.handleEvent (package:flutter/src/gestures/binding.dart:464)
    #10 GestureBinding.dispatchEvent (package:flutter/src/gestures/binding.dart:440)
    #11 RendererBinding.dispatchEvent (package:flutter/src/rendering/binding.dart:337)
    #12 GestureBinding._handlePointerEventImmediately (package:flutter/src/gestures/binding.dart:395)
    #13 GestureBinding.handlePointerEvent (package:flutter/src/gestures/binding.dart:357)
    #14 GestureBinding._flushPointerEventQueue (package:flutter/src/gestures/binding.dart:314)
    #15 GestureBinding._handlePointerDataPacket (package:flutter/src/gestures/binding.dart:295)
    #16 _invoke1 (dart:ui/hooks.dart:167)
    #17 PlatformDispatcher._dispatchPointerDataPacket (dart:ui/platform_dispatcher.dart:341)
    #18 _dispatchPointerDataPacket (dart:ui/hooks.dart:94)
    
    Application parameters:
    
    environment: release
    version: 2.0.7
    appName: Moulin
    buildNumber: 3063
    packageName: com.calcitem.sanmill
    
    
    Custom parameters:
    
    SkillLevel: setoption name SkillLevel value 3
    MoveTime: setoption name MoveTime value 3
    Algorithm: setoption name Algorithm value 2
    DrawOnHumanExperience: setoption name DrawOnHumanExperience value true
    ConsiderMobility: setoption name ConsiderMobility value true
    AiIsLazy: setoption name AiIsLazy value false
    Shuffling: setoption name Shuffling value true
    DeveloperMode: setoption name DeveloperMode value false
    PiecesCount: setoption name PiecesCount value 9
    HasDiagonalLines: setoption name HasDiagonalLines value false
    NMoveRule: setoption name NMoveRule value 100
    EndgameNMoveRule: setoption name EndgameNMoveRule value 100
    ThreefoldRepetitionRule: setoption name ThreefoldRepetitionRule value true
    PiecesAtLeastCount: setoption name PiecesAtLeastCount value 3
    HasBannedLocations: setoption name HasBannedLocations value false
    IsWhiteLoseButNotDrawWhenBoardFull: setoption name IsWhiteLoseButNotDrawWhenBoardFull value true
    MayOnlyRemoveUnplacedPieceInPlacingPhase: setoption name MayOnlyRemoveUnplacedPieceInPlacingPhase value false
    MayMoveInPlacingPhase: setoption name MayMoveInPlacingPhase value false
    IsDefenderMoveFirst: setoption name IsDefenderMoveFirst value false
    IsLoseButNotChangeSideWhenNoWay: setoption name IsLoseButNotChangeSideWhenNoWay value true
    MayFly: setoption name MayFly value true
    FlyPieceCount: setoption name FlyPieceCount value 3
    MayRemoveFromMillsAlways: setoption name MayRemoveFromMillsAlways value false
    MayRemoveMultiple: setoption name MayRemoveMultiple value false
    MoveList: 1. e5 b4 2. c3 f4 3. e3 d2 4. d3xd2 d2 5. c5 d6 6. c4xb4 b4 7. g1 a7 8. a1 g7 9. d1xg7 g7 10. a1-a4 d6-d7xa4 11. e3-e4 d7-d6 12. e4-e3xd6 g7-g4 13. e3-e4 a7-d7 14. e4-e3xg4 d7-d6 15. e3-e4 d6-d5 16. d3-e3xd2 d5-d6 17. c3-d3 d6-d2 18. c4-c3xd2
    PositionFen: position fen @OOO*OOO/**@***@*/***OO*** b m s 8 0 3 0 0 1 23 moves (1,1)->(2,1) (1,6)->(1,5) 
    
    bug 
    opened by calcitem 0
Releases(v3.0.0)
Owner
Calcitem
直棋棋道,贵乎谨敢。首重棋品,棋艺为次。运筹帷幄,自有规矩。愚者求子,智者求势,即为是理。棋虽小道,实与兵合。善弈者博之,既为自娱,也为争先。
Calcitem
A Chess Dapp built on Polygon with staking, NFT art and collectible marketplace, and the best DAO

Pawn Wars A chess Dapp built on Polygon, Stake tokens and win $MATIC, BUY NFT powerups and chess board skins! Become the $GAMBIT master in Pawn Wars!!

Sameer Kashyap 23 Nov 14, 2022
Cyberpunk-inspired puzzle game prototype created with Flutter and Flame #Hack20 #FlutterHackathon

Ghost Rigger Prototype of a cyberpunk-inspired puzzle game set in a dystopian future: In the year 2078, the megacorporation Native Development Initiat

Float like a dash Sting like a dart 184 Dec 26, 2022
A game powered by Flutter and Flame

Flutters About Flutters is a demo game powered by Flutter and Flame. I wrote it to test out its performance and gaming capabilities and decided to ope

Florentin / 珞辰 184 Jan 8, 2023
A simple 2D multiplayer online game built using Flutter and Flame engine

Club Penguin Introduction ?? Club Penguin A multiplayer game involving penguins and anonymous chat in a virtual 2D world Before we start, you can take

Sanjeev Madhav 67 Dec 24, 2022
The simple game known as Tic Tac Toe developed with Flutter and Dart language

tic_tac_toe A new Flutter project. Game Restarted : Getting Started This project is a starting point for a Flutter application. A few resources to get

Mootaz Jaballah 1 Oct 15, 2021
An infinity procedural online game using Flutter with NodeJS and flames

Borderless World Online (BWO) An infinity procedural online game using Flutter and flames with NodeJS and Firebase for the back-end. On the Table The

Daniel Queiroz 335 Dec 21, 2022
An online version of the popular game four in a row, written in Flutter + Dart on the client and Rust on the server side.

Four in a Row - App An online version of the popular game four in a row, written in Flutter + Dart on the client and Rust on the server side. Download

Filippo Orrù 24 Jan 2, 2023
Warrior Runner - Game made with Flutter and Flame game engine

Warrior Runner - Game made with Flutter Demo and Screenshot Flutter Version Used : 1.22.4 flame: 0.29.3 hive: 1.5.0-pre Learing Resources: Create a Mo

Mohammed Hashim 20 Oct 10, 2022
A game powered by Flutter and Flame

Flutters About Flutters is a demo game powered by Flutter and Flame. I wrote it to test out its performance and gaming capabilities and decided to ope

Florentin / 珞辰 183 Jan 3, 2023
A Flutter plugin to support game center and google play games services.

A Flutter plugin to support game center and google play games services. Screenshot iOS Android Tutorials Written tutorial Video tutorial Will be added

Abedalkareem Omreyh 76 Jan 6, 2023
Snake-Game - A flutter based classic snake game with nothing just and just a feel to have play

snake_game This is a simple snake Game under development made with the help of y

Shubham Kumar 2 Mar 22, 2022
Td - FreeDefense Game with Flutter and Flame

td from https://github.com/cloudseasail/free_defense Some change , added Bloc fo

Dmitry 5 Jun 24, 2022
A Dwarf game made with Dart, Flutter and Flame

Dwart Generated by the Very Good CLI ?? Dwart game Getting Started ?? This project contains 3 flavors: development staging production To run the desir

Erick 7 Jun 11, 2022
A Pinball game built with Flutter and Firebase for Google I/O 2022.

I/O Pinball A Pinball game built with Flutter and Firebase for Google I/O 2022. Try it now and learn about how it's made. Built by Very Good Ventures

Flutter 1.9k Jan 5, 2023
A starter game in Flutter with all the bells and whistles of a mobile (iOS & Android) game

A starter game in Flutter with all the bells and whistles of a mobile (iOS & Android) game including the following features: sound music main menu scr

Samuel Abada 14 Dec 22, 2022
SpriteWidget Viktor LidholtSpriteWidget [1143⭐] - Toolkit for building complex, high performance animations and 2D games by Viktor Lidholt.

SpriteWidget SpriteWidget is a toolkit for building complex, high performance animations and 2D games with Flutter. Your sprite render tree lives insi

null 1.2k Dec 7, 2022
An awesome list that curates the best Flame games, projects, libraries, tools, tutorials, articles and more.

Awesome Flame A curated list of games, libraries, and articles related to the Flame Engine for Flutter. Flame is a minimalist 2D game engine for Flutt

Flame Engine 650 Jan 9, 2023
A simple wrapper on top of Google Play Games Services (GPGS), including auth, achievement, and more.

play_games Use Google Play Games Services on your Flutter app; this allows for signin and achievements so far, but more additions are very welcome. If

Flame Engine 59 Sep 10, 2022
Snaake is a small and very simple clone of the classic snake game from Nokia phones.

Snaake Snaake is a small and very simple clone of the classic snake game from Nokia phones. Description The objective is very simple: eat the colorful

Lucas Nunes 64 Aug 9, 2022