Cards appeared and disappeared. A card was drawn at its resting place the frame it was played, and a finished trick slid off in a straight line at a constant speed with every card starting and stopping together. Nothing about that reads as a hand putting a card down. What a real card does is arrive from the side of the person who threw it, carry past the spot it was aimed at and rock back, and finish a little crooked and a little off the mark. That is the whole model. There are no collisions and no ragdolls, because the difference between cards on a table and cards thrown down a stairwell is entirely the size of the numbers: the tilt is capped at four and a half degrees and the drift at five per cent of a card width, and both are smaller than they want to be. The flight is one underdamped spring on a single 0-to-1 value, with position, angle and height above the table all read off it. The overshoot is the spring passing 1 and returning, so the card carries and settles as one motion rather than as three animations that happen to start together. Driving them apart was tried and looked like it. The scatter is hashed out of the card's identity rather than drawn from a generator. A generator would give a card a new angle on every recomposition, which twitches; hashing the list position instead would make a card jump whenever another landed beside it. Hashed this way a card lies the same way for as long as it lies there, and no two cards in a deck lie the same way as each other. The pure half of that — the hash, the bounds, the sweep stagger — is unit tested, since it is not something a screenshot would show. The sweep now staggers and accelerates: cards break away over the first third of it rather than in lockstep, each carrying out the same turn it carried in. Piles are drawn as the last few cards of the heap and stocks as a pack with depth, so a card played onto a discard pile lands on something. Every card gains the shadow of a card lying on felt. Applied to Euchre, Kaiser, Wizard and Hearts at the trick, and to Crazy 8s, President and Golf at the pile; hands get a tilt small enough that nobody sees it and large enough that a row of cards stops looking printed. Motion follows the existing animation-speed setting through a composition local, so the slider still governs all of it. Series bumped to 1.3 for the dev channel. Co-Authored-By: Claude Opus 5 <[email protected]> Claude-Session: https://claude.ai/code/session_0132V9gE6DF9itz2z3Hn7BK9
26 lines
939 B
Properties
26 lines
939 B
Properties
# Project-wide Gradle settings.
|
|
org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8
|
|
org.gradle.parallel=true
|
|
org.gradle.caching=true
|
|
|
|
# AndroidX
|
|
android.useAndroidX=true
|
|
|
|
# Kotlin code style
|
|
kotlin.code.style=official
|
|
|
|
# Only build the resources needed for the configuration being built.
|
|
android.nonTransitiveRClass=true
|
|
|
|
# The version series every build and every release tag is named for: an APK is
|
|
# <series>.<run number>, a production tag is v<series>.<n> and a dev tag adds
|
|
# -dev. It lives here rather than in the build file because the workflows have
|
|
# to name the tag as well, and they read it straight out of this file — three
|
|
# copies of "1.2" would be three chances for a release to be tagged one thing
|
|
# and built as another.
|
|
#
|
|
# Only the series is set by hand. The number after it is the CI run number, so
|
|
# it keeps climbing on its own and an APK's versionCode never goes backwards
|
|
# when this changes.
|
|
plgVersionSeries=1.3
|