croupier: Finish Rough UI for Hearts

A very rough UI for Hearts is now complete with the addition of the:
Play phase and Score Phase UIs.

For the 1-device scenario, it's also worthwhile to add debug buttons,
so I've added those (player switcher, print log, end game early, quit)

I also added the new images by Ellen, as the default set, and am using
a cropped version of the Baku image as their backsides.

The newest version of Sky requires a very new release of pub in order
to run properly.
I couldn't upgrade mine, so I changed the Makefile to refer to the one
grabbed from your Sky checkout's third party area.

Change-Id: I21140bab783a98fb1b0b332a8eb65d97ae7ab52a
diff --git a/Makefile b/Makefile
index 4072204..3fd20af 100644
--- a/Makefile
+++ b/Makefile
@@ -3,6 +3,10 @@
 CROUPIER_DIR := $(shell pwd)
 SHELL := /bin/bash -euo pipefail
 
+# Sky wants us to use a later version of pub, so just in case, use theirs when getting packages.
+# TODO(alexfandrianto): How do I update my actual pub and my sublime pub?
+PATH := $(SKY_DIR)/src/third_party/dart-sdk/dart-sdk/bin:$(PATH)
+
 ifdef ANDROID
 	MOJO_ANDROID_FLAGS := --android
 
diff --git a/lib/components/card.dart b/lib/components/card.dart
index 5f7ee4b..37dc4d4 100644
--- a/lib/components/card.dart
+++ b/lib/components/card.dart
@@ -8,15 +8,13 @@
   Card(this.card, this.faceUp);
 
   widgets.Widget build() {
-    return new widgets.Listener(child: imageFromCard(card, faceUp));
+    return new widgets.Listener(child: _imageFromCard(card, faceUp));
   }
 
-  static widgets.Widget imageFromCard(logic_card.Card c, bool faceUp) {
-    // TODO(alexfandrianto): If we allow an optional prefix in front of this,
-    // we would be able to have multiple skins of the same deck.
-    // TODO(alexfandrianto): Better card organization?
+  static widgets.Widget _imageFromCard(logic_card.Card c, bool faceUp) {
+    // TODO(alexfandrianto): Instead of 'default', what if we were told which theme to use?
     String imageName =
-        "${c.deck}/${faceUp ? 'up' : 'down'}/${c.identifier}.png";
+        "images/default/${c.deck}/${faceUp ? 'up' : 'down'}/${c.identifier}.png";
     return new widgets.NetworkImage(src: imageName);
   }
 }
diff --git a/lib/components/card_collection.dart b/lib/components/card_collection.dart
index f1c5d21..6acf8da 100644
--- a/lib/components/card_collection.dart
+++ b/lib/components/card_collection.dart
@@ -30,6 +30,12 @@
     acceptType = other.acceptType;
   }
 
+  bool _handleWillAccept(dynamic data) {
+    print('will accept?');
+    print(data);
+    return true;
+  }
+
   void _handleAccept(component_card.Card data) {
     print('accept');
     setState(() {
@@ -82,7 +88,14 @@
 
   Widget _buildHearts() {
     List<Widget> cardComponents = new List<Widget>();
-    cardComponents.add(new Text(status));
+    if (cards.length == 0) {
+      // TODO(alexfandrianto): I wish I could remove this, but Sky actually
+      // complains about a sizing issue when you do that.
+      // This is likely related to the Positioning an unsized child bug.
+      // I think we have to control our size a bit too much in Sky.
+      // https://github.com/domokit/sky_engine/blob/master/sky/packages/sky/lib/src/widgets/sizing.md
+      cardComponents.add(new Text("")); // new Text(status)
+    }
     for (int i = 0; i < cards.length; i++) {
       component_card.Card c = new component_card.Card(cards[i], faceUp);
 
@@ -110,9 +123,8 @@
         );
       case DropType.card:
         return new DragTarget<component_card.Card>(
+            onWillAccept: _handleWillAccept,
             onAccept: _handleAccept, builder: (List<component_card.Card> data, _) {
-          print(this.cards.length);
-          print(data);
           return new Container(
               decoration: new BoxDecoration(
                   border: new Border.all(
@@ -127,9 +139,8 @@
         });
       case DropType.card_collection:
         return new DragTarget<CardCollectionComponent>(
+            onWillAccept: _handleWillAccept,
             onAccept: _handleAcceptMultiple, builder: (List<CardCollectionComponent> data, _) {
-          print('CC ${this.cards.length}');
-          print(data);
           return new Container(
               decoration: new BoxDecoration(
                   border: new Border.all(
diff --git a/lib/components/croupier.dart b/lib/components/croupier.dart
index 02c4f6d..43c82a4 100644
--- a/lib/components/croupier.dart
+++ b/lib/components/croupier.dart
@@ -15,7 +15,7 @@
     croupier = other.croupier;
   }
 
-  Function setStateCallbackFactory(logic_croupier.CroupierState s,
+  Function makeSetStateCallback(logic_croupier.CroupierState s,
       [var data = null]) {
     return () => setState(() {
       croupier.setState(s, data);
@@ -31,7 +31,7 @@
             child: new Flex([
           new FlatButton(
               child: new Text('Create Game'),
-              onPressed: setStateCallbackFactory(
+              onPressed: makeSetStateCallback(
                   logic_croupier.CroupierState.ChooseGame)),
           new FlatButton(child: new Text('Join Game')),
           new FlatButton(child: new Text('Settings'))
@@ -45,19 +45,19 @@
             child: new Flex([
           new FlatButton(
               child: new Text('Proto'),
-              onPressed: setStateCallbackFactory(
+              onPressed: makeSetStateCallback(
                   logic_croupier.CroupierState.PlayGame,
                   logic_game.GameType.Proto)),
           new FlatButton(
               child: new Text('Hearts'),
-              onPressed: setStateCallbackFactory(
+              onPressed: makeSetStateCallback(
                   logic_croupier.CroupierState.PlayGame,
                   logic_game.GameType.Hearts)),
           new FlatButton(child: new Text('Poker')),
           new FlatButton(child: new Text('Solitaire')),
           new FlatButton(
               child: new Text('Syncbase Echo'),
-              onPressed: setStateCallbackFactory(
+              onPressed: makeSetStateCallback(
                   logic_croupier.CroupierState.PlayGame,
                   logic_game.GameType.SyncbaseEcho))
         ], direction: FlexDirection.vertical));
@@ -68,7 +68,9 @@
       case logic_croupier.CroupierState.PlayGame:
         return new Container(
             padding: new EdgeDims.only(top: sky.view.paddingTop),
-            child: createGameComponent(croupier.game) // Asks the game UI to draw itself.
+            child: createGameComponent(
+              croupier.game,
+              makeSetStateCallback(logic_croupier.CroupierState.Welcome))
             );
       default:
         assert(false);
diff --git a/lib/components/draggable.dart b/lib/components/draggable.dart
index a703620..03737b6 100644
--- a/lib/components/draggable.dart
+++ b/lib/components/draggable.dart
@@ -22,8 +22,8 @@
         onPointerUp: _drop,
         child: new widgets.Transform(
             transform: new vector_math.Matrix4.identity().translate(
-                0.0,0.0),//displacement.dx, displacement.dy),
-            child: child));
+                0.0, 0.0), // displacement.dx, displacement.dy),
+            child: new widgets.Opacity(child: child, opacity: displacement != widgets.Offset.zero ? 0.5 : 1.0)));
   }
 
   widgets.EventDisposition _startDrag(sky.PointerEvent event) {
diff --git a/lib/components/game.dart b/lib/components/game.dart
index 4a36501..87ce099 100644
--- a/lib/components/game.dart
+++ b/lib/components/game.dart
@@ -11,8 +11,9 @@
 
 abstract class GameComponent extends StatefulComponent {
   Game game;
+  Function gameEndCallback;
 
-  GameComponent(this.game) {
+  GameComponent(this.game, this.gameEndCallback) {
     game.updateCallback = update;
   }
 
@@ -24,6 +25,13 @@
     this.game = other.game;
   }
 
+  // A helper that most subclasses use in order to quit their respective games.
+  void _quitGameCallback() {
+    setState(() {
+      this.gameEndCallback();
+    });
+  }
+
   Widget _makeButton(String text, Function callback) {
     return new FlatButton(child: new Text(text), onPressed: callback);
   }
@@ -31,14 +39,14 @@
   Widget build();
 }
 
-GameComponent createGameComponent(Game game) {
+GameComponent createGameComponent(Game game, Function gameEndCallback) {
   switch(game.gameType) {
     case GameType.Proto:
-      return new ProtoGameComponent(game);
+      return new ProtoGameComponent(game, gameEndCallback);
     case GameType.Hearts:
-      return new HeartsGameComponent(game);
+      return new HeartsGameComponent(game, gameEndCallback);
     case GameType.SyncbaseEcho:
-      return new SyncbaseEchoGameComponent(game);
+      return new SyncbaseEchoGameComponent(game, gameEndCallback);
     default:
       // We're probably not ready to serve the other games yet.
       assert(false);
@@ -48,7 +56,7 @@
 
 
 class ProtoGameComponent extends GameComponent {
-  ProtoGameComponent(Game game) : super(game);
+  ProtoGameComponent(Game game, Function cb) : super(game, cb);
 
   Widget build() {
     List<Widget> cardCollections = new List<Widget>();
@@ -68,7 +76,7 @@
         child: new CardCollectionComponent(game.cardCollections[4], true,
             Orientation.show1, _makeGameMoveCallback, dragChildren: true, acceptType: DropType.card)));
 
-    cardCollections.add(_makeSwitchViewButton());
+    cardCollections.add(_makeDebugButtons());
 
     return new Container(
         decoration: new BoxDecoration(backgroundColor: colors.Pink[500]),
@@ -86,8 +94,12 @@
     });
   }
 
-  Widget _makeSwitchViewButton() =>
-      _makeButton('Switch View', _switchPlayersCallback);
+  Widget _makeDebugButtons() =>
+    new Flex([
+      new Text('P${game.playerNumber}'),
+      _makeButton('Switch View', _switchPlayersCallback),
+      _makeButton('Quit', _quitGameCallback)
+    ]);
 
   void _switchPlayersCallback() {
     setState(() {
@@ -99,7 +111,7 @@
 class SyncbaseEchoGameComponent extends GameComponent {
   SyncbaseEchoImpl s;
 
-  SyncbaseEchoGameComponent(Game game) : super(game);
+  SyncbaseEchoGameComponent(Game game, Function cb) : super(game, cb);
 
   Widget build() {
     if (s == null) {
@@ -118,7 +130,8 @@
       new Text('recvMsg: ${s.recvMsg}'),
       new RaisedButton(child: new Text('doPutGet'), onPressed: s.doPutGet),
       new Text('putStr: ${s.putStr}'),
-      new Text('getStr: ${s.getStr}')
+      new Text('getStr: ${s.getStr}'),
+      _makeButton('Quit', _quitGameCallback)
     ], direction: FlexDirection.vertical));
   }
 }
@@ -126,7 +139,7 @@
 class HeartsGameComponent extends GameComponent {
   List<logic_card.Card> passingCards = new List<logic_card.Card>();
 
-  HeartsGameComponent(Game game) : super(game);
+  HeartsGameComponent(Game game, Function cb) : super(game, cb);
   Widget build() {
     return buildHearts();
     // Does NOT work in checked mode since it has a Stack of Positioned Stack with Positioned Widgets.
@@ -191,8 +204,21 @@
     });
   }
 
-  Widget _makeSwitchViewButton() =>
-      _makeButton('Switch View', _switchPlayersCallback);
+  void _endRoundDebugCallback() {
+    setState(() {
+      HeartsGame game = this.game as HeartsGame;
+      game.jumpToScorePhaseDebug();
+    });
+  }
+
+  Widget _makeDebugButtons() =>
+    new Flex([
+      new Flexible(flex: 1, child: new Text('P${game.playerNumber}')),
+      new Flexible(flex: 5, child: _makeButton('Switch View', _switchPlayersCallback)),
+      new Flexible(flex: 5, child: _makeButton('Dump Log', () => print(this.game.gamelog))),
+      new Flexible(flex: 5, child: _makeButton('End Round', _endRoundDebugCallback)),
+      new Flexible(flex: 4, child: _makeButton('Quit', _quitGameCallback))
+    ]);
 
   Widget _makeButton(String text, Function callback) {
     return new FlatButton(child: new Text(text), onPressed: callback);
@@ -203,27 +229,22 @@
 
     switch (game.phase) {
       case HeartsPhase.Deal:
-        return new Container(
-            decoration: new BoxDecoration(backgroundColor: colors.Pink[500]),
-            child: new Flex([
-          new Text('Player ${game.playerNumber}'),
-          _makeButton('Deal', game.dealCards),
-          _makeSwitchViewButton()
-        ], direction: FlexDirection.vertical));
+        return showDeal();
       case HeartsPhase.Pass:
         return showPass();
       case HeartsPhase.Take:
         return showTake();
       case HeartsPhase.Play:
+        return showPlay();
       case HeartsPhase.Score:
-        return showBoard();
+        return showScore();
       default:
         assert(false);
         return null;
     }
   }
 
-  Widget showBoard() {
+  Widget showPlay() {
     HeartsGame game = this.game as HeartsGame;
 
     List<Widget> cardCollections = new List<Widget>();
@@ -233,24 +254,65 @@
     for (int i = 0; i < 4; i++) {
       List<logic_card.Card> cards = game.cardCollections[i];
       CardCollectionComponent c = new CardCollectionComponent(
-          cards, game.playerNumber == i, Orientation.horz, _makeGameMoveCallback);
+          cards, game.playerNumber == i, Orientation.horz, _makeGameMoveCallback, dragChildren: game.whoseTurn == i);
       cardCollections.add(c); // flex
     }
 
-    cardCollections.add(new Container(
+    List<Widget> plays = new List<Widget>();
+    for (int i = 0; i < 4; i++) {
+      DropType t = DropType.none;
+      if (game.playerNumber == i) {
+        t = DropType.card;
+      }
+      plays.add(new Container(
         decoration: new BoxDecoration(
-            backgroundColor: colors.Green[500], borderRadius: 5.0),
-        child: new CardCollectionComponent(game.cardCollections[4], true,
-            Orientation.show1, _makeGameMoveCallback)));
+            backgroundColor: game.whoseTurn == i ? colors.Blue[500] : colors.Green[500], borderRadius: 5.0),
+        child: new CardCollectionComponent(game.cardCollections[i + HeartsGame.OFFSET_PLAY], true,
+            Orientation.show1, _makeGameMoveCallback, acceptType: t)));
+    }
 
-    cardCollections.add(new FlatButton(
-        child: new Text('Switch View'), onPressed: _switchPlayersCallback));
+    cardCollections.add(new Flex(plays));
+
+    cardCollections.add(_makeDebugButtons());
 
     return new Container(
         decoration: new BoxDecoration(backgroundColor: colors.Pink[500]),
         child: new Flex(cardCollections, direction: FlexDirection.vertical));
   }
 
+  Widget showScore() {
+    HeartsGame game = this.game as HeartsGame;
+
+    Widget w;
+    if (game.hasGameEnded) {
+      w = new Text("Game Over!");
+    } else if (game.ready[game.playerNumber]) {
+      w = new Text("Waiting for other players...");
+    } else {
+      w = _makeButton('Ready?', game.setReadyUI);
+    }
+
+    return new Container(
+        decoration: new BoxDecoration(backgroundColor: colors.Pink[500]),
+        child: new Flex([
+      new Text('Player ${game.playerNumber}'),
+      new Text('${game.scores}'), // TODO(alexfandrianto): we want to show round by round, deltas too, don't we?
+      w,
+      _makeButton("Return to Lobby", _quitGameCallback),
+      _makeDebugButtons()
+    ], direction: FlexDirection.vertical));
+  }
+
+  Widget showDeal() {
+    return new Container(
+        decoration: new BoxDecoration(backgroundColor: colors.Pink[500]),
+        child: new Flex([
+      new Text('Player ${game.playerNumber}'),
+      _makeButton('Deal', game.dealCards),
+      _makeDebugButtons()
+    ], direction: FlexDirection.vertical));
+  }
+
   Widget showPass() {
     HeartsGame game = this.game as HeartsGame;
 
@@ -278,9 +340,7 @@
                 Orientation.horz, _uiPassCardCallback, dragChildren: !hasPassed, acceptType: DropType.card)),
           new CardCollectionComponent(remainingCards, true,
                 Orientation.horz, _uiPassCardCallback, dragChildren: !hasPassed, acceptType: DropType.card),
-          new FlatButton(
-            child: new Text('Switch View'),
-            onPressed: _switchPlayersCallback)
+          _makeDebugButtons()
         ], direction: FlexDirection.vertical));
   }
 
@@ -305,9 +365,7 @@
           take,
           new CardCollectionComponent(playerCards, true,
                 Orientation.horz, _makeGameTakeCallback, dragChildren: true, acceptType: DropType.card_collection),
-          new FlatButton(
-            child: new Text('Switch View'),
-            onPressed: _switchPlayersCallback)
+          _makeDebugButtons()
         ], direction: FlexDirection.vertical));
   }
 }
diff --git a/lib/images/default/classic/down/c1.png b/lib/images/default/classic/down/c1.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/c1.png
Binary files differ
diff --git a/lib/images/default/classic/down/c10.png b/lib/images/default/classic/down/c10.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/c10.png
Binary files differ
diff --git a/lib/images/default/classic/down/c2.png b/lib/images/default/classic/down/c2.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/c2.png
Binary files differ
diff --git a/lib/images/default/classic/down/c3.png b/lib/images/default/classic/down/c3.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/c3.png
Binary files differ
diff --git a/lib/images/default/classic/down/c4.png b/lib/images/default/classic/down/c4.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/c4.png
Binary files differ
diff --git a/lib/images/default/classic/down/c5.png b/lib/images/default/classic/down/c5.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/c5.png
Binary files differ
diff --git a/lib/images/default/classic/down/c6.png b/lib/images/default/classic/down/c6.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/c6.png
Binary files differ
diff --git a/lib/images/default/classic/down/c7.png b/lib/images/default/classic/down/c7.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/c7.png
Binary files differ
diff --git a/lib/images/default/classic/down/c8.png b/lib/images/default/classic/down/c8.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/c8.png
Binary files differ
diff --git a/lib/images/default/classic/down/c9.png b/lib/images/default/classic/down/c9.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/c9.png
Binary files differ
diff --git a/lib/images/default/classic/down/cj.png b/lib/images/default/classic/down/cj.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/cj.png
Binary files differ
diff --git a/lib/images/default/classic/down/ck.png b/lib/images/default/classic/down/ck.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/ck.png
Binary files differ
diff --git a/lib/images/default/classic/down/cq.png b/lib/images/default/classic/down/cq.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/cq.png
Binary files differ
diff --git a/lib/images/default/classic/down/d1.png b/lib/images/default/classic/down/d1.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/d1.png
Binary files differ
diff --git a/lib/images/default/classic/down/d10.png b/lib/images/default/classic/down/d10.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/d10.png
Binary files differ
diff --git a/lib/images/default/classic/down/d2.png b/lib/images/default/classic/down/d2.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/d2.png
Binary files differ
diff --git a/lib/images/default/classic/down/d3.png b/lib/images/default/classic/down/d3.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/d3.png
Binary files differ
diff --git a/lib/images/default/classic/down/d4.png b/lib/images/default/classic/down/d4.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/d4.png
Binary files differ
diff --git a/lib/images/default/classic/down/d5.png b/lib/images/default/classic/down/d5.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/d5.png
Binary files differ
diff --git a/lib/images/default/classic/down/d6.png b/lib/images/default/classic/down/d6.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/d6.png
Binary files differ
diff --git a/lib/images/default/classic/down/d7.png b/lib/images/default/classic/down/d7.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/d7.png
Binary files differ
diff --git a/lib/images/default/classic/down/d8.png b/lib/images/default/classic/down/d8.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/d8.png
Binary files differ
diff --git a/lib/images/default/classic/down/d9.png b/lib/images/default/classic/down/d9.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/d9.png
Binary files differ
diff --git a/lib/images/default/classic/down/dj.png b/lib/images/default/classic/down/dj.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/dj.png
Binary files differ
diff --git a/lib/images/default/classic/down/dk.png b/lib/images/default/classic/down/dk.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/dk.png
Binary files differ
diff --git a/lib/images/default/classic/down/dq.png b/lib/images/default/classic/down/dq.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/dq.png
Binary files differ
diff --git a/lib/images/default/classic/down/h1.png b/lib/images/default/classic/down/h1.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/h1.png
Binary files differ
diff --git a/lib/images/default/classic/down/h10.png b/lib/images/default/classic/down/h10.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/h10.png
Binary files differ
diff --git a/lib/images/default/classic/down/h2.png b/lib/images/default/classic/down/h2.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/h2.png
Binary files differ
diff --git a/lib/images/default/classic/down/h3.png b/lib/images/default/classic/down/h3.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/h3.png
Binary files differ
diff --git a/lib/images/default/classic/down/h4.png b/lib/images/default/classic/down/h4.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/h4.png
Binary files differ
diff --git a/lib/images/default/classic/down/h5.png b/lib/images/default/classic/down/h5.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/h5.png
Binary files differ
diff --git a/lib/images/default/classic/down/h6.png b/lib/images/default/classic/down/h6.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/h6.png
Binary files differ
diff --git a/lib/images/default/classic/down/h7.png b/lib/images/default/classic/down/h7.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/h7.png
Binary files differ
diff --git a/lib/images/default/classic/down/h8.png b/lib/images/default/classic/down/h8.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/h8.png
Binary files differ
diff --git a/lib/images/default/classic/down/h9.png b/lib/images/default/classic/down/h9.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/h9.png
Binary files differ
diff --git a/lib/images/default/classic/down/hj.png b/lib/images/default/classic/down/hj.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/hj.png
Binary files differ
diff --git a/lib/images/default/classic/down/hk.png b/lib/images/default/classic/down/hk.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/hk.png
Binary files differ
diff --git a/lib/images/default/classic/down/hq.png b/lib/images/default/classic/down/hq.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/hq.png
Binary files differ
diff --git a/lib/images/default/classic/down/s1.png b/lib/images/default/classic/down/s1.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/s1.png
Binary files differ
diff --git a/lib/images/default/classic/down/s10.png b/lib/images/default/classic/down/s10.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/s10.png
Binary files differ
diff --git a/lib/images/default/classic/down/s2.png b/lib/images/default/classic/down/s2.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/s2.png
Binary files differ
diff --git a/lib/images/default/classic/down/s3.png b/lib/images/default/classic/down/s3.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/s3.png
Binary files differ
diff --git a/lib/images/default/classic/down/s4.png b/lib/images/default/classic/down/s4.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/s4.png
Binary files differ
diff --git a/lib/images/default/classic/down/s5.png b/lib/images/default/classic/down/s5.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/s5.png
Binary files differ
diff --git a/lib/images/default/classic/down/s6.png b/lib/images/default/classic/down/s6.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/s6.png
Binary files differ
diff --git a/lib/images/default/classic/down/s7.png b/lib/images/default/classic/down/s7.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/s7.png
Binary files differ
diff --git a/lib/images/default/classic/down/s8.png b/lib/images/default/classic/down/s8.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/s8.png
Binary files differ
diff --git a/lib/images/default/classic/down/s9.png b/lib/images/default/classic/down/s9.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/s9.png
Binary files differ
diff --git a/lib/images/default/classic/down/sj.png b/lib/images/default/classic/down/sj.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/sj.png
Binary files differ
diff --git a/lib/images/default/classic/down/sk.png b/lib/images/default/classic/down/sk.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/sk.png
Binary files differ
diff --git a/lib/images/default/classic/down/sq.png b/lib/images/default/classic/down/sq.png
new file mode 100644
index 0000000..3f8276b
--- /dev/null
+++ b/lib/images/default/classic/down/sq.png
Binary files differ
diff --git a/lib/images/default/classic/up/c10.png b/lib/images/default/classic/up/c10.png
new file mode 100644
index 0000000..4a4f778
--- /dev/null
+++ b/lib/images/default/classic/up/c10.png
Binary files differ
diff --git a/lib/images/default/classic/up/c2.png b/lib/images/default/classic/up/c2.png
new file mode 100644
index 0000000..ae28aea
--- /dev/null
+++ b/lib/images/default/classic/up/c2.png
Binary files differ
diff --git a/lib/images/default/classic/up/c3.png b/lib/images/default/classic/up/c3.png
new file mode 100644
index 0000000..9630282
--- /dev/null
+++ b/lib/images/default/classic/up/c3.png
Binary files differ
diff --git a/lib/images/default/classic/up/c4.png b/lib/images/default/classic/up/c4.png
new file mode 100644
index 0000000..0542f8a
--- /dev/null
+++ b/lib/images/default/classic/up/c4.png
Binary files differ
diff --git a/lib/images/default/classic/up/c5.png b/lib/images/default/classic/up/c5.png
new file mode 100644
index 0000000..fe2a818
--- /dev/null
+++ b/lib/images/default/classic/up/c5.png
Binary files differ
diff --git a/lib/images/default/classic/up/c6.png b/lib/images/default/classic/up/c6.png
new file mode 100644
index 0000000..466930b
--- /dev/null
+++ b/lib/images/default/classic/up/c6.png
Binary files differ
diff --git a/lib/images/default/classic/up/c7.png b/lib/images/default/classic/up/c7.png
new file mode 100644
index 0000000..a75bdbb
--- /dev/null
+++ b/lib/images/default/classic/up/c7.png
Binary files differ
diff --git a/lib/images/default/classic/up/c8.png b/lib/images/default/classic/up/c8.png
new file mode 100644
index 0000000..22f0100
--- /dev/null
+++ b/lib/images/default/classic/up/c8.png
Binary files differ
diff --git a/lib/images/default/classic/up/c9.png b/lib/images/default/classic/up/c9.png
new file mode 100644
index 0000000..61299cc
--- /dev/null
+++ b/lib/images/default/classic/up/c9.png
Binary files differ
diff --git a/lib/images/default/classic/up/ca.png b/lib/images/default/classic/up/ca.png
new file mode 100644
index 0000000..2a0b778
--- /dev/null
+++ b/lib/images/default/classic/up/ca.png
Binary files differ
diff --git a/lib/images/default/classic/up/cj.png b/lib/images/default/classic/up/cj.png
new file mode 100644
index 0000000..f12514f
--- /dev/null
+++ b/lib/images/default/classic/up/cj.png
Binary files differ
diff --git a/lib/images/default/classic/up/ck.png b/lib/images/default/classic/up/ck.png
new file mode 100644
index 0000000..783321f
--- /dev/null
+++ b/lib/images/default/classic/up/ck.png
Binary files differ
diff --git a/lib/images/default/classic/up/cq.png b/lib/images/default/classic/up/cq.png
new file mode 100644
index 0000000..addf04d
--- /dev/null
+++ b/lib/images/default/classic/up/cq.png
Binary files differ
diff --git a/lib/images/default/classic/up/d10.png b/lib/images/default/classic/up/d10.png
new file mode 100644
index 0000000..5afdbea
--- /dev/null
+++ b/lib/images/default/classic/up/d10.png
Binary files differ
diff --git a/lib/images/default/classic/up/d2.png b/lib/images/default/classic/up/d2.png
new file mode 100644
index 0000000..51b5534
--- /dev/null
+++ b/lib/images/default/classic/up/d2.png
Binary files differ
diff --git a/lib/images/default/classic/up/d3.png b/lib/images/default/classic/up/d3.png
new file mode 100644
index 0000000..ebb082f
--- /dev/null
+++ b/lib/images/default/classic/up/d3.png
Binary files differ
diff --git a/lib/images/default/classic/up/d4.png b/lib/images/default/classic/up/d4.png
new file mode 100644
index 0000000..1240a9f
--- /dev/null
+++ b/lib/images/default/classic/up/d4.png
Binary files differ
diff --git a/lib/images/default/classic/up/d5.png b/lib/images/default/classic/up/d5.png
new file mode 100644
index 0000000..df381ec
--- /dev/null
+++ b/lib/images/default/classic/up/d5.png
Binary files differ
diff --git a/lib/images/default/classic/up/d6.png b/lib/images/default/classic/up/d6.png
new file mode 100644
index 0000000..43e4347
--- /dev/null
+++ b/lib/images/default/classic/up/d6.png
Binary files differ
diff --git a/lib/images/default/classic/up/d7.png b/lib/images/default/classic/up/d7.png
new file mode 100644
index 0000000..ed87b34
--- /dev/null
+++ b/lib/images/default/classic/up/d7.png
Binary files differ
diff --git a/lib/images/default/classic/up/d8.png b/lib/images/default/classic/up/d8.png
new file mode 100644
index 0000000..eef9ee7
--- /dev/null
+++ b/lib/images/default/classic/up/d8.png
Binary files differ
diff --git a/lib/images/default/classic/up/d9.png b/lib/images/default/classic/up/d9.png
new file mode 100644
index 0000000..6410b5e
--- /dev/null
+++ b/lib/images/default/classic/up/d9.png
Binary files differ
diff --git a/lib/images/default/classic/up/da.png b/lib/images/default/classic/up/da.png
new file mode 100644
index 0000000..d605a72
--- /dev/null
+++ b/lib/images/default/classic/up/da.png
Binary files differ
diff --git a/lib/images/default/classic/up/dj.png b/lib/images/default/classic/up/dj.png
new file mode 100644
index 0000000..43e40cf
--- /dev/null
+++ b/lib/images/default/classic/up/dj.png
Binary files differ
diff --git a/lib/images/default/classic/up/dk.png b/lib/images/default/classic/up/dk.png
new file mode 100644
index 0000000..66da79d
--- /dev/null
+++ b/lib/images/default/classic/up/dk.png
Binary files differ
diff --git a/lib/images/default/classic/up/dq.png b/lib/images/default/classic/up/dq.png
new file mode 100644
index 0000000..d5cd590
--- /dev/null
+++ b/lib/images/default/classic/up/dq.png
Binary files differ
diff --git a/lib/images/default/classic/up/h10.png b/lib/images/default/classic/up/h10.png
new file mode 100644
index 0000000..eb67655
--- /dev/null
+++ b/lib/images/default/classic/up/h10.png
Binary files differ
diff --git a/lib/images/default/classic/up/h2.png b/lib/images/default/classic/up/h2.png
new file mode 100644
index 0000000..d9d1782
--- /dev/null
+++ b/lib/images/default/classic/up/h2.png
Binary files differ
diff --git a/lib/images/default/classic/up/h3.png b/lib/images/default/classic/up/h3.png
new file mode 100644
index 0000000..83f5ff6
--- /dev/null
+++ b/lib/images/default/classic/up/h3.png
Binary files differ
diff --git a/lib/images/default/classic/up/h4.png b/lib/images/default/classic/up/h4.png
new file mode 100644
index 0000000..89c7ff7
--- /dev/null
+++ b/lib/images/default/classic/up/h4.png
Binary files differ
diff --git a/lib/images/default/classic/up/h5.png b/lib/images/default/classic/up/h5.png
new file mode 100644
index 0000000..5a9f089
--- /dev/null
+++ b/lib/images/default/classic/up/h5.png
Binary files differ
diff --git a/lib/images/default/classic/up/h6.png b/lib/images/default/classic/up/h6.png
new file mode 100644
index 0000000..f3e32e4
--- /dev/null
+++ b/lib/images/default/classic/up/h6.png
Binary files differ
diff --git a/lib/images/default/classic/up/h7.png b/lib/images/default/classic/up/h7.png
new file mode 100644
index 0000000..b2d291d
--- /dev/null
+++ b/lib/images/default/classic/up/h7.png
Binary files differ
diff --git a/lib/images/default/classic/up/h8.png b/lib/images/default/classic/up/h8.png
new file mode 100644
index 0000000..4366a45
--- /dev/null
+++ b/lib/images/default/classic/up/h8.png
Binary files differ
diff --git a/lib/images/default/classic/up/h9.png b/lib/images/default/classic/up/h9.png
new file mode 100644
index 0000000..9bf626f
--- /dev/null
+++ b/lib/images/default/classic/up/h9.png
Binary files differ
diff --git a/lib/images/default/classic/up/ha.png b/lib/images/default/classic/up/ha.png
new file mode 100644
index 0000000..b5fda7d
--- /dev/null
+++ b/lib/images/default/classic/up/ha.png
Binary files differ
diff --git a/lib/images/default/classic/up/hj.png b/lib/images/default/classic/up/hj.png
new file mode 100644
index 0000000..1f74ff7
--- /dev/null
+++ b/lib/images/default/classic/up/hj.png
Binary files differ
diff --git a/lib/images/default/classic/up/hk.png b/lib/images/default/classic/up/hk.png
new file mode 100644
index 0000000..166d13b
--- /dev/null
+++ b/lib/images/default/classic/up/hk.png
Binary files differ
diff --git a/lib/images/default/classic/up/hq.png b/lib/images/default/classic/up/hq.png
new file mode 100644
index 0000000..c7b55af
--- /dev/null
+++ b/lib/images/default/classic/up/hq.png
Binary files differ
diff --git a/lib/images/default/classic/up/s10.png b/lib/images/default/classic/up/s10.png
new file mode 100644
index 0000000..ab3ef54
--- /dev/null
+++ b/lib/images/default/classic/up/s10.png
Binary files differ
diff --git a/lib/images/default/classic/up/s2.png b/lib/images/default/classic/up/s2.png
new file mode 100644
index 0000000..4b2df7c
--- /dev/null
+++ b/lib/images/default/classic/up/s2.png
Binary files differ
diff --git a/lib/images/default/classic/up/s3.png b/lib/images/default/classic/up/s3.png
new file mode 100644
index 0000000..f950455
--- /dev/null
+++ b/lib/images/default/classic/up/s3.png
Binary files differ
diff --git a/lib/images/default/classic/up/s4.png b/lib/images/default/classic/up/s4.png
new file mode 100644
index 0000000..e0e9a39
--- /dev/null
+++ b/lib/images/default/classic/up/s4.png
Binary files differ
diff --git a/lib/images/default/classic/up/s5.png b/lib/images/default/classic/up/s5.png
new file mode 100644
index 0000000..9dffd38
--- /dev/null
+++ b/lib/images/default/classic/up/s5.png
Binary files differ
diff --git a/lib/images/default/classic/up/s6.png b/lib/images/default/classic/up/s6.png
new file mode 100644
index 0000000..edded91
--- /dev/null
+++ b/lib/images/default/classic/up/s6.png
Binary files differ
diff --git a/lib/images/default/classic/up/s7.png b/lib/images/default/classic/up/s7.png
new file mode 100644
index 0000000..3c95f28
--- /dev/null
+++ b/lib/images/default/classic/up/s7.png
Binary files differ
diff --git a/lib/images/default/classic/up/s8.png b/lib/images/default/classic/up/s8.png
new file mode 100644
index 0000000..2c26e47
--- /dev/null
+++ b/lib/images/default/classic/up/s8.png
Binary files differ
diff --git a/lib/images/default/classic/up/s9.png b/lib/images/default/classic/up/s9.png
new file mode 100644
index 0000000..51874ac
--- /dev/null
+++ b/lib/images/default/classic/up/s9.png
Binary files differ
diff --git a/lib/images/default/classic/up/sa.png b/lib/images/default/classic/up/sa.png
new file mode 100644
index 0000000..e7d7bb5
--- /dev/null
+++ b/lib/images/default/classic/up/sa.png
Binary files differ
diff --git a/lib/images/default/classic/up/sj.png b/lib/images/default/classic/up/sj.png
new file mode 100644
index 0000000..8e625c5
--- /dev/null
+++ b/lib/images/default/classic/up/sj.png
Binary files differ
diff --git a/lib/images/default/classic/up/sk.png b/lib/images/default/classic/up/sk.png
new file mode 100644
index 0000000..c706bce
--- /dev/null
+++ b/lib/images/default/classic/up/sk.png
Binary files differ
diff --git a/lib/images/default/classic/up/sq.png b/lib/images/default/classic/up/sq.png
new file mode 100644
index 0000000..84de08d
--- /dev/null
+++ b/lib/images/default/classic/up/sq.png
Binary files differ
diff --git a/lib/classic/down/c1.png b/lib/images/redback/classic/down/c1.png
similarity index 100%
rename from lib/classic/down/c1.png
rename to lib/images/redback/classic/down/c1.png
Binary files differ
diff --git a/lib/classic/down/c10.png b/lib/images/redback/classic/down/c10.png
similarity index 100%
rename from lib/classic/down/c10.png
rename to lib/images/redback/classic/down/c10.png
Binary files differ
diff --git a/lib/classic/down/c2.png b/lib/images/redback/classic/down/c2.png
similarity index 100%
rename from lib/classic/down/c2.png
rename to lib/images/redback/classic/down/c2.png
Binary files differ
diff --git a/lib/classic/down/c3.png b/lib/images/redback/classic/down/c3.png
similarity index 100%
rename from lib/classic/down/c3.png
rename to lib/images/redback/classic/down/c3.png
Binary files differ
diff --git a/lib/classic/down/c4.png b/lib/images/redback/classic/down/c4.png
similarity index 100%
rename from lib/classic/down/c4.png
rename to lib/images/redback/classic/down/c4.png
Binary files differ
diff --git a/lib/classic/down/c5.png b/lib/images/redback/classic/down/c5.png
similarity index 100%
rename from lib/classic/down/c5.png
rename to lib/images/redback/classic/down/c5.png
Binary files differ
diff --git a/lib/classic/down/c6.png b/lib/images/redback/classic/down/c6.png
similarity index 100%
rename from lib/classic/down/c6.png
rename to lib/images/redback/classic/down/c6.png
Binary files differ
diff --git a/lib/classic/down/c7.png b/lib/images/redback/classic/down/c7.png
similarity index 100%
rename from lib/classic/down/c7.png
rename to lib/images/redback/classic/down/c7.png
Binary files differ
diff --git a/lib/classic/down/c8.png b/lib/images/redback/classic/down/c8.png
similarity index 100%
rename from lib/classic/down/c8.png
rename to lib/images/redback/classic/down/c8.png
Binary files differ
diff --git a/lib/classic/down/c9.png b/lib/images/redback/classic/down/c9.png
similarity index 100%
rename from lib/classic/down/c9.png
rename to lib/images/redback/classic/down/c9.png
Binary files differ
diff --git a/lib/classic/down/cj.png b/lib/images/redback/classic/down/cj.png
similarity index 100%
rename from lib/classic/down/cj.png
rename to lib/images/redback/classic/down/cj.png
Binary files differ
diff --git a/lib/classic/down/ck.png b/lib/images/redback/classic/down/ck.png
similarity index 100%
rename from lib/classic/down/ck.png
rename to lib/images/redback/classic/down/ck.png
Binary files differ
diff --git a/lib/classic/down/cq.png b/lib/images/redback/classic/down/cq.png
similarity index 100%
rename from lib/classic/down/cq.png
rename to lib/images/redback/classic/down/cq.png
Binary files differ
diff --git a/lib/classic/down/d1.png b/lib/images/redback/classic/down/d1.png
similarity index 100%
rename from lib/classic/down/d1.png
rename to lib/images/redback/classic/down/d1.png
Binary files differ
diff --git a/lib/classic/down/d10.png b/lib/images/redback/classic/down/d10.png
similarity index 100%
rename from lib/classic/down/d10.png
rename to lib/images/redback/classic/down/d10.png
Binary files differ
diff --git a/lib/classic/down/d2.png b/lib/images/redback/classic/down/d2.png
similarity index 100%
rename from lib/classic/down/d2.png
rename to lib/images/redback/classic/down/d2.png
Binary files differ
diff --git a/lib/classic/down/d3.png b/lib/images/redback/classic/down/d3.png
similarity index 100%
rename from lib/classic/down/d3.png
rename to lib/images/redback/classic/down/d3.png
Binary files differ
diff --git a/lib/classic/down/d4.png b/lib/images/redback/classic/down/d4.png
similarity index 100%
rename from lib/classic/down/d4.png
rename to lib/images/redback/classic/down/d4.png
Binary files differ
diff --git a/lib/classic/down/d5.png b/lib/images/redback/classic/down/d5.png
similarity index 100%
rename from lib/classic/down/d5.png
rename to lib/images/redback/classic/down/d5.png
Binary files differ
diff --git a/lib/classic/down/d6.png b/lib/images/redback/classic/down/d6.png
similarity index 100%
rename from lib/classic/down/d6.png
rename to lib/images/redback/classic/down/d6.png
Binary files differ
diff --git a/lib/classic/down/d7.png b/lib/images/redback/classic/down/d7.png
similarity index 100%
rename from lib/classic/down/d7.png
rename to lib/images/redback/classic/down/d7.png
Binary files differ
diff --git a/lib/classic/down/d8.png b/lib/images/redback/classic/down/d8.png
similarity index 100%
rename from lib/classic/down/d8.png
rename to lib/images/redback/classic/down/d8.png
Binary files differ
diff --git a/lib/classic/down/d9.png b/lib/images/redback/classic/down/d9.png
similarity index 100%
rename from lib/classic/down/d9.png
rename to lib/images/redback/classic/down/d9.png
Binary files differ
diff --git a/lib/classic/down/dj.png b/lib/images/redback/classic/down/dj.png
similarity index 100%
rename from lib/classic/down/dj.png
rename to lib/images/redback/classic/down/dj.png
Binary files differ
diff --git a/lib/classic/down/dk.png b/lib/images/redback/classic/down/dk.png
similarity index 100%
rename from lib/classic/down/dk.png
rename to lib/images/redback/classic/down/dk.png
Binary files differ
diff --git a/lib/classic/down/dq.png b/lib/images/redback/classic/down/dq.png
similarity index 100%
rename from lib/classic/down/dq.png
rename to lib/images/redback/classic/down/dq.png
Binary files differ
diff --git a/lib/classic/down/h1.png b/lib/images/redback/classic/down/h1.png
similarity index 100%
rename from lib/classic/down/h1.png
rename to lib/images/redback/classic/down/h1.png
Binary files differ
diff --git a/lib/classic/down/h10.png b/lib/images/redback/classic/down/h10.png
similarity index 100%
rename from lib/classic/down/h10.png
rename to lib/images/redback/classic/down/h10.png
Binary files differ
diff --git a/lib/classic/down/h2.png b/lib/images/redback/classic/down/h2.png
similarity index 100%
rename from lib/classic/down/h2.png
rename to lib/images/redback/classic/down/h2.png
Binary files differ
diff --git a/lib/classic/down/h3.png b/lib/images/redback/classic/down/h3.png
similarity index 100%
rename from lib/classic/down/h3.png
rename to lib/images/redback/classic/down/h3.png
Binary files differ
diff --git a/lib/classic/down/h4.png b/lib/images/redback/classic/down/h4.png
similarity index 100%
rename from lib/classic/down/h4.png
rename to lib/images/redback/classic/down/h4.png
Binary files differ
diff --git a/lib/classic/down/h5.png b/lib/images/redback/classic/down/h5.png
similarity index 100%
rename from lib/classic/down/h5.png
rename to lib/images/redback/classic/down/h5.png
Binary files differ
diff --git a/lib/classic/down/h6.png b/lib/images/redback/classic/down/h6.png
similarity index 100%
rename from lib/classic/down/h6.png
rename to lib/images/redback/classic/down/h6.png
Binary files differ
diff --git a/lib/classic/down/h7.png b/lib/images/redback/classic/down/h7.png
similarity index 100%
rename from lib/classic/down/h7.png
rename to lib/images/redback/classic/down/h7.png
Binary files differ
diff --git a/lib/classic/down/h8.png b/lib/images/redback/classic/down/h8.png
similarity index 100%
rename from lib/classic/down/h8.png
rename to lib/images/redback/classic/down/h8.png
Binary files differ
diff --git a/lib/classic/down/h9.png b/lib/images/redback/classic/down/h9.png
similarity index 100%
rename from lib/classic/down/h9.png
rename to lib/images/redback/classic/down/h9.png
Binary files differ
diff --git a/lib/classic/down/hj.png b/lib/images/redback/classic/down/hj.png
similarity index 100%
rename from lib/classic/down/hj.png
rename to lib/images/redback/classic/down/hj.png
Binary files differ
diff --git a/lib/classic/down/hk.png b/lib/images/redback/classic/down/hk.png
similarity index 100%
rename from lib/classic/down/hk.png
rename to lib/images/redback/classic/down/hk.png
Binary files differ
diff --git a/lib/classic/down/hq.png b/lib/images/redback/classic/down/hq.png
similarity index 100%
rename from lib/classic/down/hq.png
rename to lib/images/redback/classic/down/hq.png
Binary files differ
diff --git a/lib/classic/down/s1.png b/lib/images/redback/classic/down/s1.png
similarity index 100%
rename from lib/classic/down/s1.png
rename to lib/images/redback/classic/down/s1.png
Binary files differ
diff --git a/lib/classic/down/s10.png b/lib/images/redback/classic/down/s10.png
similarity index 100%
rename from lib/classic/down/s10.png
rename to lib/images/redback/classic/down/s10.png
Binary files differ
diff --git a/lib/classic/down/s2.png b/lib/images/redback/classic/down/s2.png
similarity index 100%
rename from lib/classic/down/s2.png
rename to lib/images/redback/classic/down/s2.png
Binary files differ
diff --git a/lib/classic/down/s3.png b/lib/images/redback/classic/down/s3.png
similarity index 100%
rename from lib/classic/down/s3.png
rename to lib/images/redback/classic/down/s3.png
Binary files differ
diff --git a/lib/classic/down/s4.png b/lib/images/redback/classic/down/s4.png
similarity index 100%
rename from lib/classic/down/s4.png
rename to lib/images/redback/classic/down/s4.png
Binary files differ
diff --git a/lib/classic/down/s5.png b/lib/images/redback/classic/down/s5.png
similarity index 100%
rename from lib/classic/down/s5.png
rename to lib/images/redback/classic/down/s5.png
Binary files differ
diff --git a/lib/classic/down/s6.png b/lib/images/redback/classic/down/s6.png
similarity index 100%
rename from lib/classic/down/s6.png
rename to lib/images/redback/classic/down/s6.png
Binary files differ
diff --git a/lib/classic/down/s7.png b/lib/images/redback/classic/down/s7.png
similarity index 100%
rename from lib/classic/down/s7.png
rename to lib/images/redback/classic/down/s7.png
Binary files differ
diff --git a/lib/classic/down/s8.png b/lib/images/redback/classic/down/s8.png
similarity index 100%
rename from lib/classic/down/s8.png
rename to lib/images/redback/classic/down/s8.png
Binary files differ
diff --git a/lib/classic/down/s9.png b/lib/images/redback/classic/down/s9.png
similarity index 100%
rename from lib/classic/down/s9.png
rename to lib/images/redback/classic/down/s9.png
Binary files differ
diff --git a/lib/classic/down/sj.png b/lib/images/redback/classic/down/sj.png
similarity index 100%
rename from lib/classic/down/sj.png
rename to lib/images/redback/classic/down/sj.png
Binary files differ
diff --git a/lib/classic/down/sk.png b/lib/images/redback/classic/down/sk.png
similarity index 100%
rename from lib/classic/down/sk.png
rename to lib/images/redback/classic/down/sk.png
Binary files differ
diff --git a/lib/classic/down/sq.png b/lib/images/redback/classic/down/sq.png
similarity index 100%
rename from lib/classic/down/sq.png
rename to lib/images/redback/classic/down/sq.png
Binary files differ
diff --git a/lib/classic/up/c1.png b/lib/images/redback/classic/up/c1.png
similarity index 100%
rename from lib/classic/up/c1.png
rename to lib/images/redback/classic/up/c1.png
Binary files differ
diff --git a/lib/classic/up/c10.png b/lib/images/redback/classic/up/c10.png
similarity index 100%
rename from lib/classic/up/c10.png
rename to lib/images/redback/classic/up/c10.png
Binary files differ
diff --git a/lib/classic/up/c2.png b/lib/images/redback/classic/up/c2.png
similarity index 100%
rename from lib/classic/up/c2.png
rename to lib/images/redback/classic/up/c2.png
Binary files differ
diff --git a/lib/classic/up/c3.png b/lib/images/redback/classic/up/c3.png
similarity index 100%
rename from lib/classic/up/c3.png
rename to lib/images/redback/classic/up/c3.png
Binary files differ
diff --git a/lib/classic/up/c4.png b/lib/images/redback/classic/up/c4.png
similarity index 100%
rename from lib/classic/up/c4.png
rename to lib/images/redback/classic/up/c4.png
Binary files differ
diff --git a/lib/classic/up/c5.png b/lib/images/redback/classic/up/c5.png
similarity index 100%
rename from lib/classic/up/c5.png
rename to lib/images/redback/classic/up/c5.png
Binary files differ
diff --git a/lib/classic/up/c6.png b/lib/images/redback/classic/up/c6.png
similarity index 100%
rename from lib/classic/up/c6.png
rename to lib/images/redback/classic/up/c6.png
Binary files differ
diff --git a/lib/classic/up/c7.png b/lib/images/redback/classic/up/c7.png
similarity index 100%
rename from lib/classic/up/c7.png
rename to lib/images/redback/classic/up/c7.png
Binary files differ
diff --git a/lib/classic/up/c8.png b/lib/images/redback/classic/up/c8.png
similarity index 100%
rename from lib/classic/up/c8.png
rename to lib/images/redback/classic/up/c8.png
Binary files differ
diff --git a/lib/classic/up/c9.png b/lib/images/redback/classic/up/c9.png
similarity index 100%
rename from lib/classic/up/c9.png
rename to lib/images/redback/classic/up/c9.png
Binary files differ
diff --git a/lib/classic/up/cj.png b/lib/images/redback/classic/up/cj.png
similarity index 100%
rename from lib/classic/up/cj.png
rename to lib/images/redback/classic/up/cj.png
Binary files differ
diff --git a/lib/classic/up/ck.png b/lib/images/redback/classic/up/ck.png
similarity index 100%
rename from lib/classic/up/ck.png
rename to lib/images/redback/classic/up/ck.png
Binary files differ
diff --git a/lib/classic/up/cq.png b/lib/images/redback/classic/up/cq.png
similarity index 100%
rename from lib/classic/up/cq.png
rename to lib/images/redback/classic/up/cq.png
Binary files differ
diff --git a/lib/classic/up/d1.png b/lib/images/redback/classic/up/d1.png
similarity index 100%
rename from lib/classic/up/d1.png
rename to lib/images/redback/classic/up/d1.png
Binary files differ
diff --git a/lib/classic/up/d10.png b/lib/images/redback/classic/up/d10.png
similarity index 100%
rename from lib/classic/up/d10.png
rename to lib/images/redback/classic/up/d10.png
Binary files differ
diff --git a/lib/classic/up/d2.png b/lib/images/redback/classic/up/d2.png
similarity index 100%
rename from lib/classic/up/d2.png
rename to lib/images/redback/classic/up/d2.png
Binary files differ
diff --git a/lib/classic/up/d3.png b/lib/images/redback/classic/up/d3.png
similarity index 100%
rename from lib/classic/up/d3.png
rename to lib/images/redback/classic/up/d3.png
Binary files differ
diff --git a/lib/classic/up/d4.png b/lib/images/redback/classic/up/d4.png
similarity index 100%
rename from lib/classic/up/d4.png
rename to lib/images/redback/classic/up/d4.png
Binary files differ
diff --git a/lib/classic/up/d5.png b/lib/images/redback/classic/up/d5.png
similarity index 100%
rename from lib/classic/up/d5.png
rename to lib/images/redback/classic/up/d5.png
Binary files differ
diff --git a/lib/classic/up/d6.png b/lib/images/redback/classic/up/d6.png
similarity index 100%
rename from lib/classic/up/d6.png
rename to lib/images/redback/classic/up/d6.png
Binary files differ
diff --git a/lib/classic/up/d7.png b/lib/images/redback/classic/up/d7.png
similarity index 100%
rename from lib/classic/up/d7.png
rename to lib/images/redback/classic/up/d7.png
Binary files differ
diff --git a/lib/classic/up/d8.png b/lib/images/redback/classic/up/d8.png
similarity index 100%
rename from lib/classic/up/d8.png
rename to lib/images/redback/classic/up/d8.png
Binary files differ
diff --git a/lib/classic/up/d9.png b/lib/images/redback/classic/up/d9.png
similarity index 100%
rename from lib/classic/up/d9.png
rename to lib/images/redback/classic/up/d9.png
Binary files differ
diff --git a/lib/classic/up/dj.png b/lib/images/redback/classic/up/dj.png
similarity index 100%
rename from lib/classic/up/dj.png
rename to lib/images/redback/classic/up/dj.png
Binary files differ
diff --git a/lib/classic/up/dk.png b/lib/images/redback/classic/up/dk.png
similarity index 100%
rename from lib/classic/up/dk.png
rename to lib/images/redback/classic/up/dk.png
Binary files differ
diff --git a/lib/classic/up/dq.png b/lib/images/redback/classic/up/dq.png
similarity index 100%
rename from lib/classic/up/dq.png
rename to lib/images/redback/classic/up/dq.png
Binary files differ
diff --git a/lib/classic/up/ec.png b/lib/images/redback/classic/up/ec.png
similarity index 100%
rename from lib/classic/up/ec.png
rename to lib/images/redback/classic/up/ec.png
Binary files differ
diff --git a/lib/classic/up/h1.png b/lib/images/redback/classic/up/h1.png
similarity index 100%
rename from lib/classic/up/h1.png
rename to lib/images/redback/classic/up/h1.png
Binary files differ
diff --git a/lib/classic/up/h10.png b/lib/images/redback/classic/up/h10.png
similarity index 100%
rename from lib/classic/up/h10.png
rename to lib/images/redback/classic/up/h10.png
Binary files differ
diff --git a/lib/classic/up/h2.png b/lib/images/redback/classic/up/h2.png
similarity index 100%
rename from lib/classic/up/h2.png
rename to lib/images/redback/classic/up/h2.png
Binary files differ
diff --git a/lib/classic/up/h3.png b/lib/images/redback/classic/up/h3.png
similarity index 100%
rename from lib/classic/up/h3.png
rename to lib/images/redback/classic/up/h3.png
Binary files differ
diff --git a/lib/classic/up/h4.png b/lib/images/redback/classic/up/h4.png
similarity index 100%
rename from lib/classic/up/h4.png
rename to lib/images/redback/classic/up/h4.png
Binary files differ
diff --git a/lib/classic/up/h5.png b/lib/images/redback/classic/up/h5.png
similarity index 100%
rename from lib/classic/up/h5.png
rename to lib/images/redback/classic/up/h5.png
Binary files differ
diff --git a/lib/classic/up/h6.png b/lib/images/redback/classic/up/h6.png
similarity index 100%
rename from lib/classic/up/h6.png
rename to lib/images/redback/classic/up/h6.png
Binary files differ
diff --git a/lib/classic/up/h7.png b/lib/images/redback/classic/up/h7.png
similarity index 100%
rename from lib/classic/up/h7.png
rename to lib/images/redback/classic/up/h7.png
Binary files differ
diff --git a/lib/classic/up/h8.png b/lib/images/redback/classic/up/h8.png
similarity index 100%
rename from lib/classic/up/h8.png
rename to lib/images/redback/classic/up/h8.png
Binary files differ
diff --git a/lib/classic/up/h9.png b/lib/images/redback/classic/up/h9.png
similarity index 100%
rename from lib/classic/up/h9.png
rename to lib/images/redback/classic/up/h9.png
Binary files differ
diff --git a/lib/classic/up/hj.png b/lib/images/redback/classic/up/hj.png
similarity index 100%
rename from lib/classic/up/hj.png
rename to lib/images/redback/classic/up/hj.png
Binary files differ
diff --git a/lib/classic/up/hk.png b/lib/images/redback/classic/up/hk.png
similarity index 100%
rename from lib/classic/up/hk.png
rename to lib/images/redback/classic/up/hk.png
Binary files differ
diff --git a/lib/classic/up/hq.png b/lib/images/redback/classic/up/hq.png
similarity index 100%
rename from lib/classic/up/hq.png
rename to lib/images/redback/classic/up/hq.png
Binary files differ
diff --git a/lib/classic/up/index.html b/lib/images/redback/classic/up/index.html
similarity index 100%
rename from lib/classic/up/index.html
rename to lib/images/redback/classic/up/index.html
diff --git a/lib/classic/up/jb.png b/lib/images/redback/classic/up/jb.png
similarity index 100%
rename from lib/classic/up/jb.png
rename to lib/images/redback/classic/up/jb.png
Binary files differ
diff --git a/lib/classic/up/jr.png b/lib/images/redback/classic/up/jr.png
similarity index 100%
rename from lib/classic/up/jr.png
rename to lib/images/redback/classic/up/jr.png
Binary files differ
diff --git a/lib/classic/up/s1.png b/lib/images/redback/classic/up/s1.png
similarity index 100%
rename from lib/classic/up/s1.png
rename to lib/images/redback/classic/up/s1.png
Binary files differ
diff --git a/lib/classic/up/s10.png b/lib/images/redback/classic/up/s10.png
similarity index 100%
rename from lib/classic/up/s10.png
rename to lib/images/redback/classic/up/s10.png
Binary files differ
diff --git a/lib/classic/up/s2.png b/lib/images/redback/classic/up/s2.png
similarity index 100%
rename from lib/classic/up/s2.png
rename to lib/images/redback/classic/up/s2.png
Binary files differ
diff --git a/lib/classic/up/s3.png b/lib/images/redback/classic/up/s3.png
similarity index 100%
rename from lib/classic/up/s3.png
rename to lib/images/redback/classic/up/s3.png
Binary files differ
diff --git a/lib/classic/up/s4.png b/lib/images/redback/classic/up/s4.png
similarity index 100%
rename from lib/classic/up/s4.png
rename to lib/images/redback/classic/up/s4.png
Binary files differ
diff --git a/lib/classic/up/s5.png b/lib/images/redback/classic/up/s5.png
similarity index 100%
rename from lib/classic/up/s5.png
rename to lib/images/redback/classic/up/s5.png
Binary files differ
diff --git a/lib/classic/up/s6.png b/lib/images/redback/classic/up/s6.png
similarity index 100%
rename from lib/classic/up/s6.png
rename to lib/images/redback/classic/up/s6.png
Binary files differ
diff --git a/lib/classic/up/s7.png b/lib/images/redback/classic/up/s7.png
similarity index 100%
rename from lib/classic/up/s7.png
rename to lib/images/redback/classic/up/s7.png
Binary files differ
diff --git a/lib/classic/up/s8.png b/lib/images/redback/classic/up/s8.png
similarity index 100%
rename from lib/classic/up/s8.png
rename to lib/images/redback/classic/up/s8.png
Binary files differ
diff --git a/lib/classic/up/s9.png b/lib/images/redback/classic/up/s9.png
similarity index 100%
rename from lib/classic/up/s9.png
rename to lib/images/redback/classic/up/s9.png
Binary files differ
diff --git a/lib/classic/up/sj.png b/lib/images/redback/classic/up/sj.png
similarity index 100%
rename from lib/classic/up/sj.png
rename to lib/images/redback/classic/up/sj.png
Binary files differ
diff --git a/lib/classic/up/sk.png b/lib/images/redback/classic/up/sk.png
similarity index 100%
rename from lib/classic/up/sk.png
rename to lib/images/redback/classic/up/sk.png
Binary files differ
diff --git a/lib/classic/up/sq.png b/lib/images/redback/classic/up/sq.png
similarity index 100%
rename from lib/classic/up/sq.png
rename to lib/images/redback/classic/up/sq.png
Binary files differ
diff --git a/lib/logic/game.dart b/lib/logic/game.dart
index de9c5f3..ad2ee7f 100644
--- a/lib/logic/game.dart
+++ b/lib/logic/game.dart
@@ -52,6 +52,7 @@
 
   List<Card> deckPeek(int numCards, [int start = 0]) {
     assert(deck.length >= numCards);
+
     List<Card> cards = new List<Card>.from(deck.getRange(start, start + numCards));
     return cards;
   }
@@ -70,6 +71,7 @@
     for (int i = 0; i < cardCollections.length; i++) {
       cardCollections[i].clear();
     }
+    deck.clear();
     deck.addAll(Card.All);
   }
 
@@ -183,10 +185,15 @@
     deck.shuffle();
 
     // These things happen asynchronously, so we have to specify all cards now.
-    deal(PLAYER_A, this.deckPeek(13, 0));
-    deal(PLAYER_B, this.deckPeek(13, 13));
-    deal(PLAYER_C, this.deckPeek(13, 26));
-    deal(PLAYER_D, this.deckPeek(13, 39));
+    List<Card> forA = this.deckPeek(13, 0);
+    List<Card> forB = this.deckPeek(13, 13);
+    List<Card> forC = this.deckPeek(13, 26);
+    List<Card> forD = this.deckPeek(13, 39);
+
+    deal(PLAYER_A, forA);
+    deal(PLAYER_B, forB);
+    deal(PLAYER_C, forC);
+    deal(PLAYER_D, forD);
   }
 
   int get passTarget {
@@ -318,7 +325,8 @@
   // Note that this will be called by the UI.
   // It won't be possible to pass for other players, except via the GameLog.
   void passCards(List<Card> cards) {
-    assert(phase == HeartsPhase.Pass && this.passTarget != null);
+    assert(phase == HeartsPhase.Pass);
+    assert(this.passTarget != null);
     if (cards.length != 3) {
       throw new StateError('3 cards expected, but got: ${cards.toString()}');
     }
@@ -328,7 +336,8 @@
   // Note that this will be called by the UI.
   // It won't be possible to take cards for other players, except via the GameLog.
   void takeCards() {
-    assert(phase == HeartsPhase.Take && this.takeTarget != null);
+    assert(phase == HeartsPhase.Take);
+    assert(this.takeTarget != null);
     List<Card> cards = this.cardCollections[takeTarget + OFFSET_PASS];
     assert(cards.length == 3);
 
@@ -349,7 +358,8 @@
   // The UI will handle the drag-drop of the Pass Phase with its own state.
   // The UI will initiate pass separately.
   void move(Card card, List<Card> dest) {
-    assert(phase == HeartsPhase.Play && whoseTurn == playerNumber);
+    assert(phase == HeartsPhase.Play);
+    assert(whoseTurn == playerNumber);
 
     int i = findCard(card);
     if (i == -1) {
@@ -540,6 +550,25 @@
     }
     return total;
   }
+
+  // TODO(alexfandrianto): Remove. This is just for testing the UI without having
+  // to play through the whole game.
+  void jumpToScorePhaseDebug() {
+    for (int i = 0; i < 4; i++) {
+      // Move the hand cards, pass cards, etc. to the tricks for each player.
+      // If you're in the deal phase, this will probably do nothing.
+      List<Card> trick = cardCollections[i + OFFSET_TRICK];
+      trick.addAll(cardCollections[i + OFFSET_HAND]);
+      cardCollections[i + OFFSET_HAND].clear();
+      trick.addAll(cardCollections[i + OFFSET_PLAY]);
+      cardCollections[i + OFFSET_PLAY].clear();
+      trick.addAll(cardCollections[i + OFFSET_PASS]);
+      cardCollections[i + OFFSET_PASS].clear();
+    }
+
+    phase = HeartsPhase.Score;
+    this.prepareScore();
+  }
 }
 
 abstract class GameLog {
@@ -610,6 +639,10 @@
     _tryPendingCommand();
   }
 
+  String toString() {
+    return log.toString();
+  }
+
   // UNIMPLEMENTED: Let subclasses override this.
   void addToLogCb(List<GameCommand> log, GameCommand newCommand);
   List<GameCommand> updateLogCb(List<GameCommand> current, List<GameCommand> other, int mismatchIndex);