blob: dc0daf25b5a17011f9041182d7c659ef72823559 [file] [log] [blame]
import '../logic/card.dart' show Card;
import '../logic/game.dart' show Game, GameType, Viewer, HeartsGame, HeartsPhase;
import 'card_collection.dart' show CardCollectionComponent, Orientation;
import 'package:sky/widgets/basic.dart';
import 'package:sky/widgets.dart' show FlatButton;
import 'package:sky/theme/colors.dart' as colors;
import 'board.dart' show Board;
class GameComponent extends StatefulComponent {
Game game;
GameComponent(this.game) {
game.updateCallback = update;
}
void update() {
setState(() {});
}
void syncConstructorArguments(GameComponent other) {
this.game = other.game;
}
Widget build() {
switch (game.gameType) {
case GameType.Proto:
return buildProto();
case GameType.Hearts:
return buildHearts();
case GameType.Board:
// Does NOT work in checked mode since it has a Stack of Positioned Stack with Positioned Widgets.
return new Board(1, [2,3,4], [1, 2, 3, 4]);
default:
return null; // unsupported
}
}
_switchPlayersCallback() {
setState(() {
game.playerNumber = (game.playerNumber + 1) % 4;
});
}
_updateGameCallback(Card card, List<Card> dest) {
setState(() {
try {
game.move(card, dest);
} catch(e) {
print("You can't do that! ${e.toString()}");
game.debugString = e.toString();
}
});
}
Widget buildProto() {
List<Widget> cardCollections = new List<Widget>();
// debugString
cardCollections.add(new Text(game.debugString));
for (int i = 0; i < 4; i++) {
List<Card> cards = game.cardCollections[i];
CardCollectionComponent c = new CardCollectionComponent(cards, game.playerNumber == i, Orientation.horz, _updateGameCallback);
/*cardCollections.add(new Positioned(
top: i * (card_constants.CARD_HEIGHT + 20.0),
child: c
));*/
/*cardCollections.add(new Transform(
transform: new vector_math.Matrix4.identity().translate(0.0, i * (card_constants.CARD_HEIGHT + 20.0)),
child: c
));*/
cardCollections.add(c); // flex
}
// game.cardCollections[4] is a discard pile
/*cardCollections.add(new Transform(
transform: new vector_math.Matrix4.identity().translate(0.0, 4 * (card_constants.CARD_HEIGHT + 20.0)),
child: new Container(
decoration: new BoxDecoration(backgroundColor: colors.Green[500], borderRadius: 5.0),
child: new CardCollectionComponent(game.cardCollections[4], true, Orientation.horz, _parentHandleAccept)
)
));*/
/*cardCollections.add(new Positioned(
top: 4 * (card_constants.CARD_HEIGHT + 20.0),
child: new Container(
decoration: new BoxDecoration(backgroundColor: colors.Green[500], borderRadius: 5.0),
child: new CardCollectionComponent(game.cardCollections[4], true, Orientation.horz)
)
));*/
cardCollections.add(new Container(
decoration: new BoxDecoration(backgroundColor: colors.Green[500], borderRadius: 5.0),
child: new CardCollectionComponent(game.cardCollections[4], true, Orientation.show1, _updateGameCallback)
));
// game.cardCollections[5] is just not shown
cardCollections.add(new FlatButton(
child: new Text('Switch View'),
onPressed: _switchPlayersCallback
));
return new Container(
decoration: new BoxDecoration(backgroundColor: colors.Pink[500]),
child: new Flex(cardCollections, direction: FlexDirection.vertical)//new Stack(cardCollections)
);
}
Widget _makeSwitchViewButton() =>_makeButton('Switch View', _switchPlayersCallback);
Widget _makeButton(String text, Function callback) {
return new FlatButton(
child: new Text(text),
onPressed: callback
);
}
Widget buildHearts() {
HeartsGame game = this.game as HeartsGame;
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)
);
case HeartsPhase.Pass:
case HeartsPhase.Take:
case HeartsPhase.Play:
case HeartsPhase.Score:
return showBoard();
default:
assert(false); // What?
return null;
}
}
Widget showBoard() {
HeartsGame game = this.game as HeartsGame;
List<Widget> cardCollections = new List<Widget>();
cardCollections.add(new Text(game.debugString));
for (int i = 0; i < 4; i++) {
List<Card> cards = game.cardCollections[i];
CardCollectionComponent c = new CardCollectionComponent(cards, game.playerNumber == i, Orientation.horz, _updateGameCallback);
cardCollections.add(c); // flex
}
cardCollections.add(new Container(
decoration: new BoxDecoration(backgroundColor: colors.Green[500], borderRadius: 5.0),
child: new CardCollectionComponent(game.cardCollections[4], true, Orientation.show1, _updateGameCallback)
));
cardCollections.add(new FlatButton(
child: new Text('Switch View'),
onPressed: _switchPlayersCallback
));
return new Container(
decoration: new BoxDecoration(backgroundColor: colors.Pink[500]),
child: new Flex(cardCollections, direction: FlexDirection.vertical)
);
}
}