github.com/loomnetwork/gamechain@v0.0.0-20200406110549-36c47eb97a92/cli/cmd/replay_game.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/auth"
    12  	"github.com/spf13/cobra"
    13  )
    14  
    15  var replayGameCmdArgs struct {
    16  	matchID           int64
    17  	stopAtActionIndex int32
    18  }
    19  
    20  var replayGameCmd = &cobra.Command{
    21  	Use:   "replay_game",
    22  	Short: "replay_game",
    23  	RunE: func(cmd *cobra.Command, args []string) error {
    24  		signer := auth.NewEd25519Signer(commonTxObjs.privateKey)
    25  
    26  		var req = zb_calls.ReplayGameRequest{
    27  			MatchId:           replayGameCmdArgs.matchID,
    28  			StopAtActionIndex: replayGameCmdArgs.stopAtActionIndex,
    29  		}
    30  		var resp zb_calls.ReplayGameResponse
    31  
    32  		_, err := commonTxObjs.contract.Call("ReplayGame", &req, signer, &resp)
    33  		if err != nil {
    34  			return err
    35  		}
    36  
    37  		switch strings.ToLower(rootCmdArgs.outputFormat) {
    38  		case "json":
    39  			err := battleground_utility.PrintProtoMessageAsJsonToStdout(resp.GameState)
    40  			if err != nil {
    41  				return err
    42  			}
    43  		default:
    44  			state := resp.GameState
    45  			actionOutcomes := resp.ActionOutcomes
    46  			formatAbility := func(abilities []*zb_data.CardAbilityInstance) string {
    47  				b := new(bytes.Buffer)
    48  				for _, a := range abilities {
    49  					b.WriteString(fmt.Sprintf("Abilities: [%+v trigger=%v active=%v]\n", a.AbilityType, a.Trigger, a.IsActive))
    50  				}
    51  				return b.String()
    52  			}
    53  
    54  			formatAction := func(action *zb_data.PlayerAction) string {
    55  				return fmt.Sprintf("%s: %s, %+v", action.ActionType, action.PlayerId, action.Action)
    56  			}
    57  
    58  			for i, player := range state.PlayerStates {
    59  				if state.CurrentPlayerIndex == int32(i) {
    60  					fmt.Printf("Player%d: %s 🧟\n", i+1, player.Id)
    61  				} else {
    62  					fmt.Printf("Player%d: %s\n", i+1, player.Id)
    63  				}
    64  				fmt.Printf("\tstats:\n")
    65  				fmt.Printf("\t\tdefense: %v\n", player.Defense)
    66  				fmt.Printf("\t\tcurrent goo: %v\n", player.CurrentGoo)
    67  				fmt.Printf("\t\tgoo vials: %v\n", player.GooVials)
    68  				fmt.Printf("\t\thas drawn card: %v\n", player.HasDrawnCard)
    69  				fmt.Printf("\tmulligan (%d):\n", len(player.MulliganCards))
    70  				for _, card := range player.MulliganCards {
    71  					fmt.Printf("\t\tName:%s\n", card.Prototype.Name)
    72  				}
    73  				fmt.Printf("\tcard in hand (%d):\n", len(player.CardsInHand))
    74  				for _, card := range player.CardsInHand {
    75  					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))
    76  				}
    77  				fmt.Printf("\tcard in play (%d):\n", len(player.CardsInPlay))
    78  				for _, card := range player.CardsInPlay {
    79  					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))
    80  				}
    81  				fmt.Printf("\tcard in deck (%d):\n", len(player.CardsInDeck))
    82  				for _, card := range player.CardsInDeck {
    83  					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))
    84  				}
    85  				fmt.Printf("\tcard in graveyard (%d):\n", len(player.CardsInGraveyard))
    86  				for _, card := range player.CardsInGraveyard {
    87  					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))
    88  				}
    89  				fmt.Printf("\n") // extra line
    90  			}
    91  			fmt.Printf("Actions: count %v\n", len(state.PlayerActions))
    92  			for i, action := range state.PlayerActions {
    93  				if int64(i) == state.CurrentActionIndex {
    94  					fmt.Printf("   -->> [%-2d] %v\n", i, formatAction(action))
    95  				} else {
    96  					fmt.Printf("\t[%2d] %v\n", i, formatAction(action))
    97  				}
    98  			}
    99  			fmt.Printf("Current Action Index: %v\n", state.CurrentActionIndex)
   100  
   101  			fmt.Printf("Ability Outcomes:\n")
   102  			for i, outcome := range actionOutcomes {
   103  				fmt.Printf("\t[%d] %v\n", i, outcome)
   104  			}
   105  
   106  			fmt.Printf("==================================\n")
   107  		}
   108  
   109  		return nil
   110  	},
   111  }
   112  
   113  func init() {
   114  	rootCmd.AddCommand(replayGameCmd)
   115  	replayGameCmd.Flags().Int64VarP(&replayGameCmdArgs.matchID, "matchId", "m", 0, "Match Id")
   116  	replayGameCmd.Flags().Int32VarP(&replayGameCmdArgs.stopAtActionIndex, "stopAt", "i", -1, "stop at action index")
   117  }