diff --git a/lib/api/deck_of_cards_api.dart b/lib/api/deck_of_cards_api.dart index c5b1232..73744f4 100644 --- a/lib/api/deck_of_cards_api.dart +++ b/lib/api/deck_of_cards_api.dart @@ -1,7 +1,8 @@ import 'package:dio/dio.dart'; -import 'package:karma_palace/model/draw_a_card_response.dart'; -import 'package:karma_palace/model/piles_response.dart'; -import 'package:karma_palace/model/shuffle_cards_response.dart'; +import 'package:karma_palace/model/api/draw_a_card_response.dart'; +import 'package:karma_palace/model/api/piles_response.dart'; +import 'package:karma_palace/model/api/shuffle_cards_response.dart'; + import 'package:retrofit/retrofit.dart'; part 'deck_of_cards_api.g.dart'; diff --git a/lib/model/deck_of_cards_response.dart b/lib/model/api/deck_of_cards_response.dart similarity index 100% rename from lib/model/deck_of_cards_response.dart rename to lib/model/api/deck_of_cards_response.dart diff --git a/lib/model/draw_a_card_response.dart b/lib/model/api/draw_a_card_response.dart similarity index 79% rename from lib/model/draw_a_card_response.dart rename to lib/model/api/draw_a_card_response.dart index 6d16af6..1d6d81d 100644 --- a/lib/model/draw_a_card_response.dart +++ b/lib/model/api/draw_a_card_response.dart @@ -1,6 +1,6 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:karma_palace/model/deck_of_cards_response.dart'; -import 'package:karma_palace/model/playing_card.dart'; +import 'package:karma_palace/model/api/deck_of_cards_response.dart'; +import 'package:karma_palace/model/api/playing_card.dart'; part 'draw_a_card_response.g.dart'; diff --git a/lib/model/pile.dart b/lib/model/api/pile.dart similarity index 86% rename from lib/model/pile.dart rename to lib/model/api/pile.dart index 28805ff..cac46b9 100644 --- a/lib/model/pile.dart +++ b/lib/model/api/pile.dart @@ -1,5 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:karma_palace/model/playing_card.dart'; +import 'package:karma_palace/model/api/playing_card.dart'; part 'pile.g.dart'; diff --git a/lib/model/piles_response.dart b/lib/model/api/piles_response.dart similarity index 74% rename from lib/model/piles_response.dart rename to lib/model/api/piles_response.dart index dce552a..2bb6819 100644 --- a/lib/model/piles_response.dart +++ b/lib/model/api/piles_response.dart @@ -1,7 +1,7 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:karma_palace/model/deck_of_cards_response.dart'; -import 'package:karma_palace/model/pile.dart'; -import 'package:karma_palace/model/playing_card.dart'; +import 'package:karma_palace/model/api/deck_of_cards_response.dart'; +import 'package:karma_palace/model/api/pile.dart'; +import 'package:karma_palace/model/api/playing_card.dart'; part 'piles_response.g.dart'; diff --git a/lib/model/playing_card.dart b/lib/model/api/playing_card.dart similarity index 100% rename from lib/model/playing_card.dart rename to lib/model/api/playing_card.dart diff --git a/lib/model/shuffle_cards_response.dart b/lib/model/api/shuffle_cards_response.dart similarity index 87% rename from lib/model/shuffle_cards_response.dart rename to lib/model/api/shuffle_cards_response.dart index b0c7dbe..475eee6 100644 --- a/lib/model/shuffle_cards_response.dart +++ b/lib/model/api/shuffle_cards_response.dart @@ -1,5 +1,5 @@ import 'package:json_annotation/json_annotation.dart'; -import 'package:karma_palace/model/deck_of_cards_response.dart'; +import 'package:karma_palace/model/api/deck_of_cards_response.dart'; part 'shuffle_cards_response.g.dart'; diff --git a/lib/model/internal/card.dart b/lib/model/internal/card.dart new file mode 100644 index 0000000..a167c8d --- /dev/null +++ b/lib/model/internal/card.dart @@ -0,0 +1,20 @@ +class Card { + /// The image URL of the card + String image; + + /// The value of the card (e.g. 9, 10, JACK, QUEEN) + String value; + + /// The suit of the card (e.g. HEARTS, SPADES) + String suit; + + /// Card code (e.g. 8C for 8 of Clubs) + String code; + + Card({ + required this.image, + required this.value, + required this.suit, + required this.code, + }); +} diff --git a/lib/model/internal/player.dart b/lib/model/internal/player.dart new file mode 100644 index 0000000..af0ea29 --- /dev/null +++ b/lib/model/internal/player.dart @@ -0,0 +1,22 @@ +import 'package:karma_palace/model/internal/card.dart'; + +class Player { + /// Name of player + String name; + + /// Cards in players hand + List hand; + + /// Cards faced down in front of player + List downHand; + + /// Cards faced up in front of player + List upHand; + + Player({ + required this.name, + required this.hand, + required this.downHand, + required this.upHand, + }); +} diff --git a/lib/model/internal/room.dart b/lib/model/internal/room.dart new file mode 100644 index 0000000..aabce06 --- /dev/null +++ b/lib/model/internal/room.dart @@ -0,0 +1,16 @@ +import 'package:karma_palace/model/internal/card.dart'; +import 'package:karma_palace/model/internal/player.dart'; + +class Room { + List players; + List deck; + List playingPile; + List discardPile; + + Room({ + required this.players, + required this.deck, + required this.playingPile, + required this.discardPile, + }); +} diff --git a/lib/model/player.dart b/lib/model/player.dart deleted file mode 100644 index ed36fdd..0000000 --- a/lib/model/player.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; - -part 'player.g.dart'; - -@JsonSerializable(explicitToJson: true) -class Player { - String id; - String name; - - Player({ - required this.id, - required this.name, - }); - - factory Player.fromJson(Map json) => _$PlayerFromJson(json); - - Map toJson() => _$PlayerToJson(this); -} diff --git a/lib/model/room.dart b/lib/model/room.dart deleted file mode 100644 index 45bcbc0..0000000 --- a/lib/model/room.dart +++ /dev/null @@ -1,17 +0,0 @@ -import 'package:json_annotation/json_annotation.dart'; -import 'package:karma_palace/model/player.dart'; - -part 'room.g.dart'; - -@JsonSerializable(explicitToJson: true) -class Room { - List players; - - Room({ - required this.players, - }); - - factory Room.fromJson(Map json) => _$RoomFromJson(json); - - Map toJson() => _$RoomToJson(this); -} diff --git a/lib/screen/game_screen.dart b/lib/screen/game_screen.dart deleted file mode 100644 index f7ae3ba..0000000 --- a/lib/screen/game_screen.dart +++ /dev/null @@ -1,355 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:karma_palace/model/draw_a_card_response.dart'; -import 'package:karma_palace/model/piles_response.dart'; -import 'package:karma_palace/model/player.dart'; -import 'package:karma_palace/model/playing_card.dart'; -import 'package:karma_palace/model/shuffle_cards_response.dart'; -import 'package:karma_palace/service/card_service.dart'; -import 'package:karma_palace/service/messaging_service.dart'; -import 'package:logger/logger.dart'; -import 'package:share_plus/share_plus.dart'; -import 'package:uuid/uuid.dart'; - -class GameScreen extends StatefulWidget { - const GameScreen({super.key}); - - @override - State createState() => _GameScreenState(); -} - -class _GameScreenState extends State { - final Logger _logger = Logger(); - final CardService _cardService = CardService(); - final MessagingService _messagingService = MessagingService(); - final String _pileNameMiddle = 'middle'; - - late String _pileNameHand; - late String _pileNameCardsFaceDown; - late String _pileNameCardsFaceUp; - - late String _deckId = ''; - late String _playerId; - late Player _player; - - List _middle = []; - List _hand = []; - List _cardsFaceDown = []; - List _cardsFaceUp = []; - - @override - void initState() { - super.initState(); - _setUp(); - } - - @override - Widget build(BuildContext context) { - return Scaffold( - // floatingActionButtonLocation: FloatingActionButtonLocation.startFloat, - // floatingActionButton: backFloatingActionButton(context), - body: SafeArea( - child: Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - flex: 2, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Flexible( - child: Center(child: Text('1')), - ), - Expanded( - flex: 3, - child: Container( - color: Colors.green, - child: const Center(child: Text('2')), - ), - ), - const Flexible( - child: Center(child: Text('3')), - ), - ], - ), - ), - Expanded( - flex: 5, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Flexible( - child: Container( - color: Colors.green, - child: const Center(child: Text('4')), - ), - ), - Expanded( - flex: 3, - child: _deckId.isEmpty - ? Column( - children: [ - TextButton( - onPressed: () async { - DeckResponse deckResponse = await _cardService - .createNewShuffledDeck(false); - setState(() { - _startNewGame(deckResponse); - }); - }, - child: const Text('Create Room'), - ), - TextButton( - onPressed: () async { - String roomId = ''; - showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - title: const Text('Enter room code:'), - content: Column( - mainAxisSize: MainAxisSize.min, - children: [ - TextField( - onChanged: (value) => - roomId = value, - decoration: const InputDecoration( - hintText: 'Enter room code...', - prefixIcon: Icon(Icons.code), - ), - autocorrect: false, - ), - ], - ), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(roomId); - }, - child: const Text('OK'), - ), - ], - ); - }, - ).then( - (value) => setState(() { - _deckId = value!; - if (_deckId.isNotEmpty) { - _messagingService.joinExistingRoom( - _deckId, _player); - _drawInitialPiles().catchError( - (Object error, - StackTrace stackTrace) { - _deckId = ''; - _showErrorMessage(context); - }); - } - }), - ); - }, - child: const Text('Join Room'), - ), - ], - ) - : Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - TextButton( - onPressed: () { - Share.share(_deckId); - }, - child: Text(_deckId), - ), - if (_middle.isNotEmpty) - IconButton( - icon: Image.network(_middle.last.image), - iconSize: 100, - onPressed: () async { - // TODO: Pick up if you cannot play - }, - ), - ], - ), - ), - Flexible( - child: Container( - color: Colors.green, - child: const Center(child: Text('6')), - ), - ), - ], - ), - ), - Expanded( - flex: 4, - child: Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: [ - Expanded( - flex: 5, - child: _buildCards(), - ), - ], - ), - ), - ], - ), - ), - ); - } - - void _startNewGame(DeckResponse deckResponse) { - _deckId = deckResponse.deckId ?? ''; - _messagingService.saveNewRoom(_deckId, _player); - _drawInitialPiles(); - } - - void _showErrorMessage(BuildContext context) { - showDialog( - context: context, - barrierDismissible: false, - builder: (BuildContext context) { - return AlertDialog( - title: const Text('Could not enter room'), - content: const Column( - mainAxisSize: MainAxisSize.min, - children: [ - Text('Fuck'), - ], - ), - actions: [ - TextButton( - onPressed: () { - Navigator.of(context).pop(); - }, - child: const Text('Dammit'), - ), - ], - ); - }, - ); - } - - void _setUp() { - _playerId = const Uuid().v4().split('-')[0]; - _player = Player( - id: _playerId, - name: 'Player_$_playerId', - ); - - _pileNameHand = '${_playerId}_hand'; - _pileNameCardsFaceDown = '${_playerId}_face_down'; - _pileNameCardsFaceUp = '${_playerId}_face_up'; - } - - Widget _buildCards() { - return Column( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - mainAxisSize: MainAxisSize.min, - children: [ - _buildCardsSet(_hand, _pileNameHand), - Stack( - alignment: Alignment.center, - children: [ - _buildCardsSet(_cardsFaceDown, _pileNameCardsFaceDown, true), - Positioned.fill( - top: 5, - bottom: -5, - left: 5, - right: -5, - child: _buildCardsSet(_cardsFaceUp, _pileNameCardsFaceUp), - // child: Container(height: 50, width: 50, color: Colors.purple), - ), - ], - ), - ], - ); - } - - Row _buildCardsSet(List cards, String pileName, - [bool faceDown = false]) { - return Row( - crossAxisAlignment: CrossAxisAlignment.center, - mainAxisAlignment: MainAxisAlignment.center, - children: cards.map((c) { - return Flexible( - child: IconButton( - icon: faceDown - ? Image.asset('assets/images/card_back.png') - : Image.network(c.image), - iconSize: 60, - onPressed: () async { - // TODO: Check card is a valid play - // TODO: Draw cards from pile - PilesResponse p = - await _cardService.drawFromPile(_deckId, pileName, [c.code]); - - // Put cards into 'middle' pile - await _cardService.addToPile( - _deckId, _pileNameMiddle, _extractPlayingCardCodes(p.cards!)); - p = await _cardService.listPile(_deckId, _pileNameMiddle); - setState(() { - _middle = p.piles![_pileNameMiddle]!.cards!; - }); - - // If pile is the hand, then draw from deck - if (pileName == _pileNameHand) { - // TODO: Draw card from deck if hand <= 2 && deck is not empty - DrawCardResponse dcr = await _cardService.drawCards(_deckId, 1); - await _cardService.addToPile(_deckId, _pileNameHand, - _extractPlayingCardCodes(dcr.cards!)); - setState(() { - _hand.remove(c); - _hand.addAll(dcr.cards!); - }); - } else if (pileName == _pileNameCardsFaceUp) { - setState(() { - _cardsFaceUp.remove(c); - }); - } else if (pileName == _pileNameCardsFaceDown) { - _cardsFaceDown.remove(c); - } - }, - ), - ); - }).toList(), - ); - } - - List _extractPlayingCardCodes(List cards) { - return cards.map((c) => c.code).toList(); - } - - Future _drawInitialPiles() async { - List hand = []; - List cardsFaceDown = []; - List cardsFaceUp = []; - - DrawCardResponse drawCardResponse = - await _cardService.drawCards(_deckId, 9); - - hand = drawCardResponse.cards!.getRange(0, 3).toList(); - cardsFaceDown = drawCardResponse.cards!.getRange(3, 6).toList(); - cardsFaceUp = drawCardResponse.cards!.getRange(6, 9).toList(); - - await _cardService.addToPile( - _deckId, _pileNameHand, _extractPlayingCardCodes(hand)); - await _cardService.addToPile(_deckId, _pileNameCardsFaceDown, - _extractPlayingCardCodes(cardsFaceDown)); - await _cardService.addToPile( - _deckId, _pileNameCardsFaceUp, _extractPlayingCardCodes(cardsFaceUp)); - - setState(() { - _hand = hand; - _cardsFaceDown = cardsFaceDown; - _cardsFaceUp = cardsFaceUp; - }); - - _logger.d('_deckId: $_deckId'); - } -} diff --git a/lib/screen/home_screen.dart b/lib/screen/home_screen.dart deleted file mode 100644 index ed0a614..0000000 --- a/lib/screen/home_screen.dart +++ /dev/null @@ -1,46 +0,0 @@ -import 'package:flutter/material.dart'; -import 'package:karma_palace/constants/text_constants.dart'; - -class HomeScreen extends StatefulWidget { - const HomeScreen({ - super.key, - }); - - @override - State createState() => _HomeScreenState(); -} - -class _HomeScreenState extends State { - @override - Widget build(BuildContext context) { - return Scaffold( - body: Center( - child: Column( - mainAxisAlignment: MainAxisAlignment.center, - children: [ - const Text( - kAppName, - style: TextStyle( - fontSize: 48.0, - ), - ), - ElevatedButton.icon( - icon: const Icon( - Icons.play_arrow_rounded, - ), - label: const Text('Play'), - onPressed: () => Navigator.pushNamed(context, '/game'), - ), - // ElevatedButton.icon( - // icon: const Icon( - // Icons.rule_folder_rounded, - // ), - // label: const Text('Rules'), - // onPressed: () {}, - // ), - ], - ), - ), - ); - } -} diff --git a/lib/service/card_service.dart b/lib/service/card_service.dart index 7c4a487..e89bf68 100644 --- a/lib/service/card_service.dart +++ b/lib/service/card_service.dart @@ -1,9 +1,9 @@ import 'package:dio/dio.dart'; import 'package:flutter/foundation.dart'; import 'package:karma_palace/api/deck_of_cards_api.dart'; -import 'package:karma_palace/model/draw_a_card_response.dart'; -import 'package:karma_palace/model/piles_response.dart'; -import 'package:karma_palace/model/shuffle_cards_response.dart'; +import 'package:karma_palace/model/api/draw_a_card_response.dart'; +import 'package:karma_palace/model/api/piles_response.dart'; +import 'package:karma_palace/model/api/shuffle_cards_response.dart'; import 'package:logger/logger.dart'; class CardService { diff --git a/lib/service/messaging_service.dart b/lib/service/messaging_service.dart index ab864d5..a794411 100644 --- a/lib/service/messaging_service.dart +++ b/lib/service/messaging_service.dart @@ -1,37 +1,37 @@ -import 'package:firebase_database/firebase_database.dart'; -import 'package:karma_palace/model/player.dart'; -import 'package:karma_palace/model/room.dart'; +// import 'package:firebase_database/firebase_database.dart'; +// import 'package:karma_palace/model/internal/player.dart'; +// import 'package:karma_palace/model/internal/room.dart'; class MessagingService { - static final MessagingService _messagingService = - MessagingService._internal(); - - factory MessagingService() { - return _messagingService; - } - - MessagingService._internal(); - - void saveNewRoom(String roomId, Player player) async { - Room room = Room(players: [ - player, - ]); - - FirebaseDatabase database = FirebaseDatabase.instance; - DatabaseReference ref = database.ref('room/$roomId'); - await ref.set(room.toJson()); - } - - Future joinExistingRoom(String roomId, Player player) async { - FirebaseDatabase database = FirebaseDatabase.instance; - DatabaseReference roomRef = database.ref('room/$roomId'); - DatabaseEvent event = await roomRef.once(); - if (event.snapshot.exists) { - DatabaseReference roomPlayerRef = roomRef.child('players'); - DatabaseReference newPlayerRef = roomPlayerRef.push(); - newPlayerRef.set(player.toJson()); - } - - throw 'Room does not exist!'; - } + // static final MessagingService _messagingService = + // MessagingService._internal(); + // + // factory MessagingService() { + // return _messagingService; + // } + // + // MessagingService._internal(); + // + // void saveNewRoom(String roomId, Player player) async { + // Room room = Room(players: [ + // player, + // ]); + // + // FirebaseDatabase database = FirebaseDatabase.instance; + // DatabaseReference ref = database.ref('room/$roomId'); + // await ref.set(room.toJson()); + // } + // + // Future joinExistingRoom(String roomId, Player player) async { + // FirebaseDatabase database = FirebaseDatabase.instance; + // DatabaseReference roomRef = database.ref('room/$roomId'); + // DatabaseEvent event = await roomRef.once(); + // if (event.snapshot.exists) { + // DatabaseReference roomPlayerRef = roomRef.child('players'); + // DatabaseReference newPlayerRef = roomPlayerRef.push(); + // newPlayerRef.set(player.toJson()); + // } + // + // throw 'Room does not exist!'; + // } }