github.com/loomnetwork/gamechain@v0.0.0-20200406110549-36c47eb97a92/cli/cmd/get_game_state.go (about)

     1  package cmd
     2  
     3  import (
     4  	"bytes"
     5  	"fmt"
     6  	"github.com/loomnetwork/gamechain/tools/battleground_utility"
     7  	"github.com/loomnetwork/gamechain/types/zb/zb_calls"
     8  	"github.com/loomnetwork/gamechain/types/zb/zb_data"
     9  	"strings"
    10  
    11  	"github.com/loomnetwork/go-loom"
    12  	"github.com/loomnetwork/go-loom/auth"
    13  	"github.com/spf13/cobra"
    14  )
    15  
    16  var getGameStateCmdArgs struct {
    17  	MatchID int64
    18  }
    19  
    20  var getGameStateCmd = &cobra.Command{
    21  	Use:   "get_game_state",
    22  	Short: "get gamestate",
    23  	RunE: func(cmd *cobra.Command, args []string) error {
    24  		signer := auth.NewEd25519Signer(commonTxObjs.privateKey)
    25  		callerAddr := loom.Address{
    26  			ChainID: commonTxObjs.rpcClient.GetChainID(),
    27  			Local:   loom.LocalAddressFromPublicKey(signer.PublicKey()),
    28  		}
    29  		var req = zb_calls.GetGameStateRequest{
    30  			MatchId: getGameStateCmdArgs.MatchID,
    31  		}
    32  		var resp zb_calls.GetGameStateResponse
    33  		_, err := commonTxObjs.contract.StaticCall("GetGameState", &req, callerAddr, &resp)
    34  		if err != nil {
    35  			return err
    36  		}
    37  
    38  		state := resp.GameState
    39  
    40  		switch strings.ToLower(rootCmdArgs.outputFormat) {
    41  		case "json":
    42  			err := battleground_utility.PrintProtoMessageAsJsonToStdout(state)
    43  			if err != nil {
    44  				return err
    45  			}
    46  		default:
    47  			formatAbility := func(abilities []*zb_data.CardAbilityInstance) string {
    48  				b := new(bytes.Buffer)
    49  				for _, a := range abilities {
    50  					b.WriteString(fmt.Sprintf("Abilities: [%+v trigger=%v active=%v]\n", a.AbilityType, a.Trigger, a.IsActive))
    51  				}
    52  				return b.String()
    53  			}
    54  
    55  			for i, player := range state.PlayerStates {
    56  				if state.CurrentPlayerIndex == int32(i) {
    57  					fmt.Printf("Player%d: %s 🧟\n", i+1, player.Id)
    58  				} else {
    59  					fmt.Printf("Player%d: %s\n", i+1, player.Id)
    60  				}
    61  				fmt.Printf("\tstats:\n")
    62  				fmt.Printf("\t\tdefense: %v\n", player.Defense)
    63  				fmt.Printf("\t\tcurrent goo: %v\n", player.CurrentGoo)
    64  				fmt.Printf("\t\tgoo vials: %v\n", player.GooVials)
    65  				fmt.Printf("\t\thas drawn card: %v\n", player.HasDrawnCard)
    66  				fmt.Printf("\tmulligan (%d):\n", len(player.MulliganCards))
    67  				for _, card := range player.MulliganCards {
    68  					fmt.Printf("\t\tName:%s\n", card.Prototype.Name)
    69  				}
    70  				fmt.Printf("\tcard in hand (%d):\n", len(player.CardsInHand))
    71  				for _, card := range player.CardsInHand {
    72  					fmt.Printf("\t\tId:%-2d Name:%-14s Dmg:%2d Def:%2d Goo:%2d, Zone:%0v, OwnerIndex:%d %s\n", card.InstanceId.Id, card.Prototype.Name, card.Instance.Damage, card.Instance.Defense, card.Instance.Cost, card.Zone, card.OwnerIndex, formatAbility(card.AbilitiesInstances))
    73  				}
    74  				fmt.Printf("\tcard in play (%d):\n", len(player.CardsInPlay))
    75  				for _, card := range player.CardsInPlay {
    76  					fmt.Printf("\t\tId:%-2d Name:%-14s Dmg:%2d Def:%2d Goo:%2d, Zone:%0v, OwnerIndex:%d %s\n", card.InstanceId.Id, card.Prototype.Name, card.Instance.Damage, card.Instance.Defense, card.Instance.Cost, card.Zone, card.OwnerIndex, formatAbility(card.AbilitiesInstances))
    77  				}
    78  				fmt.Printf("\tcard in deck (%d):\n", len(player.CardsInDeck))
    79  				for _, card := range player.CardsInDeck {
    80  					fmt.Printf("\t\tId:%-2d Name:%-14s Dmg:%2d Def:%2d Goo:%2d, Zone:%0v, OwnerIndex:%d %s\n", card.InstanceId.Id, card.Prototype.Name, card.Instance.Damage, card.Instance.Defense, card.Instance.Cost, card.Zone, card.OwnerIndex, formatAbility(card.AbilitiesInstances))
    81  				}
    82  				fmt.Printf("\tcard in graveyard (%d):\n", len(player.CardsInGraveyard))
    83  				for _, card := range player.CardsInGraveyard {
    84  					fmt.Printf("\t\tId:%-2d Name:%-14s Dmg:%2d Def:%2d Goo:%2d, Zone:%0v, OwnerIndex:%d %s\n", card.InstanceId.Id, card.Prototype.Name, card.Instance.Damage, card.Instance.Defense, card.Instance.Cost, card.Zone, card.OwnerIndex, formatAbility(card.AbilitiesInstances))
    85  				}
    86  				fmt.Printf("\n") // extra line
    87  			}
    88  			fmt.Printf("Actions: count %v\n", len(state.PlayerActions))
    89  			for i, action := range state.PlayerActions {
    90  				if int64(i) == state.CurrentActionIndex {
    91  					fmt.Printf("   -->> [%d] %v\n", i, action)
    92  				} else {
    93  					fmt.Printf("\t[%d] %v\n", i, action)
    94  				}
    95  			}
    96  			fmt.Printf("Current Action Index: %v\n", state.CurrentActionIndex)
    97  			fmt.Printf("Is ended: %v, Winner: %s\n", state.IsEnded, state.Winner)
    98  		}
    99  
   100  		return nil
   101  	},
   102  }
   103  
   104  func init() {
   105  	rootCmd.AddCommand(getGameStateCmd)
   106  
   107  	getGameStateCmd.Flags().Int64VarP(&getGameStateCmdArgs.MatchID, "matchId", "m", 0, "Match ID")
   108  }