Пример #1
0
        public static Task PurchaseAnimal(
            [HttpTrigger(AuthorizationLevel.Anonymous, "POST", Route = "game/{gameName}/purchase-animal")] PurchaseAnimalCommand command,
            [DurableClient] IDurableEntityClient client,
            string gameName)
        {
            var transfer = new AnimalPurchase
            {
                AnimalName   = command.AnimalName,
                NewOwnerName = command.OwnerName
            };

            var entityId = new EntityId(nameof(GameSession), gameName);

            return(client.SignalEntityAsync <IGameSession>(entityId, proxy => proxy.PurchaseAnimalAsync(transfer)));
        }
Пример #2
0
        public async Task PurchaseAnimalAsync(AnimalPurchase purchase)
        {
            var owner  = PlayerStates[purchase.NewOwnerName];
            var animal = AnimalStates[purchase.AnimalName];

            if (animal?.OwnerName == null && animal?.Price <= owner?.Credits)
            {
                owner.Credits   -= animal.Price;
                animal.OwnerName = owner.Name;

                await PublishEventAsync(new AnimalPurchasedEvent
                {
                    AnimalName = purchase.AnimalName,
                    OwnerName  = purchase.NewOwnerName
                });

                await PublishEventAsync(new CreditsChangedEvent
                {
                    PlayerName = owner.Name,
                    Credits    = owner.Credits
                });

                // Key of the animal behavior entity is:
                // <GameName>:<AnimalName>:<OwnerName>
                var entityKey = $"{Entity.Current.EntityKey}:{purchase.AnimalName}:{purchase.NewOwnerName}";
                var entityId  = new EntityId(nameof(AnimalBehavior), entityKey);
                Entity.Current.SignalEntity <IAnimalBehavior>(entityId, proxy => proxy.Start());
            }
            else
            {
                await PublishEventAsync(new AnimalPurchaseFailedEvent
                {
                    AnimalName = purchase.AnimalName,
                    OwnerName  = purchase.NewOwnerName
                });
            }
        }